gpt4 book ai didi

r - ggplot : how to add common x and y labels to a grid of plots

转载 作者:行者123 更新时间:2023-12-01 10:33:37 24 4
gpt4 key购买 nike

使用 diamonds ,我想绘制 caratprice 的 4 个级别( FairGoodVery Good 和 7x1045 of 4 6 1045 )。

我没有让 Premimum 控制轴的中断,而是绘制了四个图来控制轴的中断。

library(ggplot2)
library(egg)
library(grid)
f1 <-
ggplot(diamonds[diamonds$cut=="Fair",], aes(carat, price))+
geom_point()+
facet_wrap(~cut, ncol =2)+
scale_x_continuous(limits = c(0,4), breaks=c(0, 1, 2, 3, 4))+
scale_y_continuous(limits = c(0,10000), breaks=c(0, 2500, 5000, 7500, 10000))+
labs(x=expression(" "),
y=expression(" "))


f2 <-
ggplot(diamonds[diamonds$cut=="Good",], aes(carat, price))+
geom_point()+
facet_wrap(~cut, ncol =2)+
scale_y_continuous(limits = c(0,5000), breaks=c(0, 1000, 2000, 3000, 4000, 5000))+
labs(x=expression(" "),
y=expression(" "))


f3 <-
ggplot(diamonds[diamonds$cut=="Very Good",], aes(carat, price))+
geom_point()+
facet_wrap(~cut, ncol =2)+
scale_x_continuous(limits = c(0,1), breaks=c(0, 0.2, 0.4, 0.6, 0.8, 1))+
scale_y_continuous(limits = c(0,1000), breaks=c(0, 200, 400, 600, 800, 1000))+
labs(x=expression(" "),
y=expression(" "))

f4 <-
ggplot(diamonds[diamonds$cut=="Premium",], aes(carat, price))+
geom_point()+
facet_wrap(~cut, ncol =2)+
scale_x_continuous(limits = c(0,1.5), breaks=c(0, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4))+
scale_y_continuous(limits = c(0, 3000), breaks=c(0, 500, 1000, 1500, 2000, 2500, 3000))+
labs(x=expression(" "),
y=expression(" "))

fin_fig <- ggarrange(f1, f2, f3, f4, ncol =2)
fin_fig

结果

每个图都有一系列不同的 y 值

enter image description here

问题

在所有方面,x 轴和 y 轴都相同。唯一的区别是最小值、最大值和休息时间。我想在这个图中添加 x 和 y 标签。我可以在任何 Word 文档或图像编辑器中手动执行此操作。反正有没有直接在R中做?

最佳答案

除了使用来自 gridExtra 的函数之外包(如@user20650 所建议的),您还可以通过拆分 diamonds 以更少的代码创建您的绘图。数据帧按级别 cut并使用 mapply .

下面的答案还包括评论中后续问题的解决方案。我们展示了如何布置四个图,添加适用于所有图的单个 x 和 y 标签(包括使它们加粗并控制它们的颜色和大小),并为每个图获得单个图例而不是单独的图例。

library(ggplot2)
library(gridExtra)
library(grid)
library(scales)

删除 cut 处的行是 "Ideal" :
dat = diamonds[diamonds$cut != "Ideal",]
dat$cut = droplevels(dat$cut)

创建四个图,一个用于 cut 的每个剩余水平并存储在列表中。我们使用 mapply (而不是 lapply ),以便我们可以为 cut 的每个级别提供两个单独的数据帧和自定义向量 ymax values 分别为每个图设置 y 轴上的最大值。我们还添加了 color=clarity为了创建一个颜色图例:
pl = mapply(FUN = function(df, ymax) {
ggplot(df, aes(carat, price, color=clarity))+
geom_point()+
facet_wrap(~cut, ncol=2)+
scale_x_continuous(limits = c(0,4), breaks=0:4)+
scale_y_continuous(limits = c(0, ymax), labels=dollar_format()) +
labs(x=expression(" "),
y=expression(" "))
}, df=split(dat, dat$cut), ymax=c(1e4,5e3,1e3,3e3), SIMPLIFY=FALSE)

好的,我们有四个情节,但每个情节都有自己的传说。所以现在我们想安排只有一个整体图例。为此,我们将其中一个图例提取为单独的 grob ( gr aphical ob ject),然后从四个图中删除图例。

使用小辅助函数将图例提取为单独的 grob:
# Function to extract legend
# https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs
g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend) }

# Extract legend as a grob
leg = g_legend(pl[[1]])

现在我们需要将四个图排列在一个 2x2 的网格中,然后将图例放置在该网格的右侧。我们使用 arrangeGrob布置图(并注意我们如何使用 lapply 在渲染之前从每个图中删除图例)。这与我们对 grid.arrange 所做的基本相同在此答案的早期版本中,除了 arrangeGrob创建 2x2 绘图网格对象而不绘制它。然后我们通过将整个内容包裹在 grid.arrange 中,在 2x2 绘图网格旁边布置图例。 . widths=c(9,1)将 90% 的水平空间分配给 2x2 绘图网格,将 10% 分配给图例。哇!
grid.arrange(
arrangeGrob(grobs=lapply(pl, function(p) p + guides(colour=FALSE)), ncol=2,
bottom=textGrob("Carat", gp=gpar(fontface="bold", col="red", fontsize=15)),
left=textGrob("Price", gp=gpar(fontface="bold", col="blue", fontsize=15), rot=90)),
leg,
widths=c(9,1)
)

enter image description here

关于r - ggplot : how to add common x and y labels to a grid of plots,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39008773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com