使用 facet_wrap 在 ggplot 中添加唯一的轴标签名称
Adding unique axes label names in ggplot with facet_wrap
似乎很多用户都在尝试做我在这里也在尝试的事情。
我正在尝试做这些事情:
- 要固定的 x 轴标签(范围 0 到 1200),要在每个图上重复的 x 轴,以及要为每个图重复和自定义的 x 轴标签名称
- y 轴标签是自由的(但能够将第二个图中的范围编辑为
breaks=c(0, 3, 6, 9, 12)
),y 轴在每个图上重复,对于 y-为每个图重复和自定义轴标签
ggplot(mapping=aes(x=dist, fill=sex)) +
geom_histogram(data = cbind(move, panel = "A"), color="black", binwidth=10) +
geom_vline(data = cbind(move, panel = "A"), aes(xintercept=mean(dist)),
color="black", linetype="dashed", size=1)+
geom_histogram(data = cbind(settle_data, panel = "B"), color="black", binwidth=10) +
geom_vline(data = cbind(settle_data, panel = "B"), aes(xintercept=mean(dist)),
color="black", linetype="dashed", size=1)+
geom_histogram(data = cbind(recruit_data, panel = "C"), color="black", binwidth=10) +
geom_vline(data = cbind(recruit_data, panel = "C"), aes(xintercept=mean(dist)),
color="black", linetype="dashed", size=1)+
coord_cartesian(xlim=c(0,1200))+ #limits axes range without deleting points
scale_fill_manual(values=c("gray97", "gray47"),
name = "Sex",
breaks=c("F","M"),
labels=c("Female","Male")) +
theme_bw() +
theme(legend.position = c(0.8,0.8), #move legend into plot
axis.line = element_line(colour = "black"),
axis.text=element_text(size = 20), #changes size of axes #s
axis.title=element_text(size=20), #changes size of axes labels
plot.caption = element_text(hjust = 0, vjust = 2.12),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
text = element_text(size = 15)) +
facet_wrap(~ panel, ncol = 1, scales='free_y', labeller=as_labeller(c(A = "Number of fixes", B = "Number of individuals", C = "Number of individuals") ), strip.position="left") +
scale_x_continuous(breaks = seq(0,1250,by = 200)) +
theme(
strip.placement = "outside",
strip.background = element_blank(),
axis.title.y = element_blank(),
strip.text = element_text(size = 19))+
labs(x = "Distance travelled from natal nest (m)")
结果图(我能够 "hack" 通过将面板名称移动到图的左侧并像轴标签一样处理我遇到的 y 轴问题):
我想要的剧情(红色圈出的是编辑):
我无法 post 用于绘图的数据,但我在下面创建了一个示例数据集:
move<- data.frame(
dist = c(0,100,200,300,400,400,500,600,700,800,1000,1200,0,100,200,300,400,400,500,600,700,800,1000,1200,0,100,200,300,400,400,500,600,700,800,1000,1200,0,100,200,300,400,400,500,600,700,800,1000,1200),
sex = c ("F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F","F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F", "F"))
settle_data<-data.frame(
dist = c(0,10,20,30,400,40,50,60,700,80,1000,1200,0,10,20,30,400,40,50,60,700,80,1000,1200, 0,10,20,30,400,40,50,60,700,80,1000,1200,0,100,200,300,400,400,500,600,700,800,1000,1200,0,10,20,30,400,40,50,60,700,80,1000,1200,0,10,20,30,400,40,50,60,700,80,1000,1200,0,10,20,30,400,40,50,60,700,80,1000,1200,0,100,200,300,400,400,500,600,700,800,1000,1200),
sex = c ("F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F","F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M","F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M", "F", "F","F", "M", "M", "M", "M", "M", "F", "F", "F", "M", "F", "F", "F", "M", "M", "M","M", "M", "F", "F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M","F", "F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M","F", "F", "F", "M", "M", "M", "M", "M", "F", "F"))
recruit_data<- data.frame(
dist = c(0,10,20,30,400,40,50,60,700,80,1000,1200,0,10,20,30,4,40,50,60,700,80,10,120,0,10,20,30,40,40,50,60,70,80,100,120,0,100,200,300,400,400,500,600,700,800,1000,1200),
sex = c ("F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F","F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M","F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M", "F", "F","F", "M", "M", "M", "M", "M", "F", "F"))
我同意大多数评论,即制作单独的情节会更容易。这种方法的一个痛点通常是轴的对齐不正确。为了抵消这一点,我将指出 patchwork 包,它消除了大部分痛苦。
library(ggplot2)
library(patchwork)
# Get some basic plots
dat_list <- list(move, recruit_data, settle_data)
plots <- lapply(dat_list, function(df) {
ggplot(df, aes(dist, fill = sex)) +
geom_histogram(binwidth = 10) +
scale_x_continuous(limits = c(0, 1200)) +
theme(legend.position = "none")
})
# Make adjustments to each plot as needed
plots[[1]] <- plots[[1]] + labs(x = "Distance settled (m)", y = "Number of fixes") +
theme(legend.position = c(1,1), legend.justification = c(1,1))
plots[[2]] <- plots[[2]] + labs(x = "Distance recruited (m)", y = "Number of individuals") +
scale_y_continuous(breaks = seq(0, 12, by = 3), limits = c(0, 12))
plots[[3]] <- plots[[3]] + labs(x = "Distance from natal nest (m)", y = "Number of individuals")
# Patchwork all the plots together
plots[[1]] + plots[[2]] + plots[[3]] + plot_layout(nrow = 3)
并根据口味进行微调。
对于那些想要或需要使用 facet_wrap
的人,这是对我有用的解决方案(从评论中提取建议)。
以下编辑给出了以下情节:
编辑的重要说明:
coord_cartesian(xlim=c(0,1200))
将所有绘图的 x 轴限制设置为相同
scale_y_continuous(breaks = scales::pretty_breaks(5))
使 y 轴没有小数
labs(x = "")
在最底部添加一个 x 轴
要为彼此的绘图添加标签,geom_text()
只需更改注释出现的绘图(panel=c("B")
和 panel=c("C")
)即可实现。
在facet_wrap()
内:
scales='free'
使得每个图都重复坐标轴
labeller=as_labeller(c([text]))
可用于为每个图赋予自己唯一的 y 轴名称
strip.position='left'
将面板移动到左侧(y 轴所在的位置)
在theme()
内:
strip.placement = "outside"
将面板标签移到图的外部,允许它们充当 y 轴标签名称
使用的代码:
ggplot(mapping=aes(x=dist, fill=sex)) +
geom_histogram(data = cbind(move, panel = "A"), color="black", binwidth=10) +
geom_vline(data = cbind(move, panel = "A"), aes(xintercept=mean(dist)),
color="black", linetype="dashed", size=1)+
geom_histogram(data = cbind(settle_data, panel = "B"), color="black", binwidth=10) +
geom_vline(data = cbind(settle_data, panel = "B"), aes(xintercept=mean(dist)),
color="black", linetype="dashed", size=1)+
geom_histogram(data = cbind(recruit_data, panel = "C"), color="black", binwidth=10) +
geom_vline(data = cbind(recruit_data, panel = "C"), aes(xintercept=mean(dist)),
color="black", linetype="dashed", size=1)+
coord_cartesian(xlim=c(0,1200))+
scale_fill_manual(values=c("gray97", "gray47"),
name = "Sex",
breaks=c("F","M"),
labels=c("Female","Male")) +
theme_bw() +
theme(legend.position = c(0.95,0.93), #move legend into plot
axis.line = element_line(colour = "black"),
axis.text=element_text(size = 20), #changes size of axes #s
axis.title=element_text(size=20), #changes size of axes labels
plot.caption = element_text(hjust = 0, vjust = 2.12),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
text = element_text(size = 20)) +
facet_wrap(~ panel, ncol = 1, scales='free', labeller=as_labeller(c(A = "Number of fixes", B = "Number of individuals", C = "Number of individuals") ), strip.position="left") +
scale_x_continuous(breaks = seq(0,1250,by = 200)) +
scale_y_continuous(breaks = scales::pretty_breaks(5))+
theme(
strip.placement = "outside",
strip.background = element_blank(),
axis.title.y = element_blank(),
strip.text = element_text(size = 19))+
labs(x = "Distance recruited from natal nest (m)")+
geom_text(data=data.frame(x=600, y=12,
label="Distance travelled from natal nest (m)", panel=c("B")),
aes(x,y,label=label), inherit.aes=FALSE, size = 7) +
geom_text(data=data.frame(x=600, y=6,
label="Distance settled from natal nest (m)", panel=c("C")),
aes(x,y,label=label), inherit.aes=FALSE, size = 7)
似乎很多用户都在尝试做我在这里也在尝试的事情。
我正在尝试做这些事情:
- 要固定的 x 轴标签(范围 0 到 1200),要在每个图上重复的 x 轴,以及要为每个图重复和自定义的 x 轴标签名称
- y 轴标签是自由的(但能够将第二个图中的范围编辑为
breaks=c(0, 3, 6, 9, 12)
),y 轴在每个图上重复,对于 y-为每个图重复和自定义轴标签
ggplot(mapping=aes(x=dist, fill=sex)) +
geom_histogram(data = cbind(move, panel = "A"), color="black", binwidth=10) +
geom_vline(data = cbind(move, panel = "A"), aes(xintercept=mean(dist)),
color="black", linetype="dashed", size=1)+
geom_histogram(data = cbind(settle_data, panel = "B"), color="black", binwidth=10) +
geom_vline(data = cbind(settle_data, panel = "B"), aes(xintercept=mean(dist)),
color="black", linetype="dashed", size=1)+
geom_histogram(data = cbind(recruit_data, panel = "C"), color="black", binwidth=10) +
geom_vline(data = cbind(recruit_data, panel = "C"), aes(xintercept=mean(dist)),
color="black", linetype="dashed", size=1)+
coord_cartesian(xlim=c(0,1200))+ #limits axes range without deleting points
scale_fill_manual(values=c("gray97", "gray47"),
name = "Sex",
breaks=c("F","M"),
labels=c("Female","Male")) +
theme_bw() +
theme(legend.position = c(0.8,0.8), #move legend into plot
axis.line = element_line(colour = "black"),
axis.text=element_text(size = 20), #changes size of axes #s
axis.title=element_text(size=20), #changes size of axes labels
plot.caption = element_text(hjust = 0, vjust = 2.12),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
text = element_text(size = 15)) +
facet_wrap(~ panel, ncol = 1, scales='free_y', labeller=as_labeller(c(A = "Number of fixes", B = "Number of individuals", C = "Number of individuals") ), strip.position="left") +
scale_x_continuous(breaks = seq(0,1250,by = 200)) +
theme(
strip.placement = "outside",
strip.background = element_blank(),
axis.title.y = element_blank(),
strip.text = element_text(size = 19))+
labs(x = "Distance travelled from natal nest (m)")
结果图(我能够 "hack" 通过将面板名称移动到图的左侧并像轴标签一样处理我遇到的 y 轴问题):
我想要的剧情(红色圈出的是编辑):
我无法 post 用于绘图的数据,但我在下面创建了一个示例数据集:
move<- data.frame(
dist = c(0,100,200,300,400,400,500,600,700,800,1000,1200,0,100,200,300,400,400,500,600,700,800,1000,1200,0,100,200,300,400,400,500,600,700,800,1000,1200,0,100,200,300,400,400,500,600,700,800,1000,1200),
sex = c ("F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F","F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F", "F"))
settle_data<-data.frame(
dist = c(0,10,20,30,400,40,50,60,700,80,1000,1200,0,10,20,30,400,40,50,60,700,80,1000,1200, 0,10,20,30,400,40,50,60,700,80,1000,1200,0,100,200,300,400,400,500,600,700,800,1000,1200,0,10,20,30,400,40,50,60,700,80,1000,1200,0,10,20,30,400,40,50,60,700,80,1000,1200,0,10,20,30,400,40,50,60,700,80,1000,1200,0,100,200,300,400,400,500,600,700,800,1000,1200),
sex = c ("F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F","F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M","F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M", "F", "F","F", "M", "M", "M", "M", "M", "F", "F", "F", "M", "F", "F", "F", "M", "M", "M","M", "M", "F", "F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M","F", "F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M","F", "F", "F", "M", "M", "M", "M", "M", "F", "F"))
recruit_data<- data.frame(
dist = c(0,10,20,30,400,40,50,60,700,80,1000,1200,0,10,20,30,4,40,50,60,700,80,10,120,0,10,20,30,40,40,50,60,70,80,100,120,0,100,200,300,400,400,500,600,700,800,1000,1200),
sex = c ("F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F","F","F", "M", "F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M","F", "F", "F", "M", "M", "M", "M", "M", "F", "F","F", "M", "F", "F","F", "M", "M", "M", "M", "M", "F", "F"))
我同意大多数评论,即制作单独的情节会更容易。这种方法的一个痛点通常是轴的对齐不正确。为了抵消这一点,我将指出 patchwork 包,它消除了大部分痛苦。
library(ggplot2)
library(patchwork)
# Get some basic plots
dat_list <- list(move, recruit_data, settle_data)
plots <- lapply(dat_list, function(df) {
ggplot(df, aes(dist, fill = sex)) +
geom_histogram(binwidth = 10) +
scale_x_continuous(limits = c(0, 1200)) +
theme(legend.position = "none")
})
# Make adjustments to each plot as needed
plots[[1]] <- plots[[1]] + labs(x = "Distance settled (m)", y = "Number of fixes") +
theme(legend.position = c(1,1), legend.justification = c(1,1))
plots[[2]] <- plots[[2]] + labs(x = "Distance recruited (m)", y = "Number of individuals") +
scale_y_continuous(breaks = seq(0, 12, by = 3), limits = c(0, 12))
plots[[3]] <- plots[[3]] + labs(x = "Distance from natal nest (m)", y = "Number of individuals")
# Patchwork all the plots together
plots[[1]] + plots[[2]] + plots[[3]] + plot_layout(nrow = 3)
并根据口味进行微调。
对于那些想要或需要使用 facet_wrap
的人,这是对我有用的解决方案(从评论中提取建议)。
以下编辑给出了以下情节:
编辑的重要说明:
coord_cartesian(xlim=c(0,1200))
将所有绘图的 x 轴限制设置为相同
scale_y_continuous(breaks = scales::pretty_breaks(5))
使 y 轴没有小数
labs(x = "")
在最底部添加一个 x 轴
要为彼此的绘图添加标签,geom_text()
只需更改注释出现的绘图(panel=c("B")
和 panel=c("C")
)即可实现。
在facet_wrap()
内:
scales='free'
使得每个图都重复坐标轴
labeller=as_labeller(c([text]))
可用于为每个图赋予自己唯一的 y 轴名称
strip.position='left'
将面板移动到左侧(y 轴所在的位置)
在theme()
内:
strip.placement = "outside"
将面板标签移到图的外部,允许它们充当 y 轴标签名称
使用的代码:
ggplot(mapping=aes(x=dist, fill=sex)) +
geom_histogram(data = cbind(move, panel = "A"), color="black", binwidth=10) +
geom_vline(data = cbind(move, panel = "A"), aes(xintercept=mean(dist)),
color="black", linetype="dashed", size=1)+
geom_histogram(data = cbind(settle_data, panel = "B"), color="black", binwidth=10) +
geom_vline(data = cbind(settle_data, panel = "B"), aes(xintercept=mean(dist)),
color="black", linetype="dashed", size=1)+
geom_histogram(data = cbind(recruit_data, panel = "C"), color="black", binwidth=10) +
geom_vline(data = cbind(recruit_data, panel = "C"), aes(xintercept=mean(dist)),
color="black", linetype="dashed", size=1)+
coord_cartesian(xlim=c(0,1200))+
scale_fill_manual(values=c("gray97", "gray47"),
name = "Sex",
breaks=c("F","M"),
labels=c("Female","Male")) +
theme_bw() +
theme(legend.position = c(0.95,0.93), #move legend into plot
axis.line = element_line(colour = "black"),
axis.text=element_text(size = 20), #changes size of axes #s
axis.title=element_text(size=20), #changes size of axes labels
plot.caption = element_text(hjust = 0, vjust = 2.12),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
text = element_text(size = 20)) +
facet_wrap(~ panel, ncol = 1, scales='free', labeller=as_labeller(c(A = "Number of fixes", B = "Number of individuals", C = "Number of individuals") ), strip.position="left") +
scale_x_continuous(breaks = seq(0,1250,by = 200)) +
scale_y_continuous(breaks = scales::pretty_breaks(5))+
theme(
strip.placement = "outside",
strip.background = element_blank(),
axis.title.y = element_blank(),
strip.text = element_text(size = 19))+
labs(x = "Distance recruited from natal nest (m)")+
geom_text(data=data.frame(x=600, y=12,
label="Distance travelled from natal nest (m)", panel=c("B")),
aes(x,y,label=label), inherit.aes=FALSE, size = 7) +
geom_text(data=data.frame(x=600, y=6,
label="Distance settled from natal nest (m)", panel=c("C")),
aes(x,y,label=label), inherit.aes=FALSE, size = 7)