如何在 ggplot 中绘制 5 点线图和 1 点条形图,facet_wrap

How plot 5 point lineplot and 1 point barplot for with facet_wrap in ggplot

提问人:Antonio Manco 提问时间:9/4/2019 最后编辑:Johannes StötzerAntonio Manco 更新时间:9/5/2019 访问量:546

问:

我有这个问题: 对于多个变量,我有 5 个不同时期的 5 个平均值,对于相同的变量,我有 1 个总平均值。 我想要绘制一个图,用小面换行,同一个图中每个变量的图形,中间的一个条形图(总平均值)上有五个点(周期平均值)。

将数据集格式化为 in r, in 无法修复中间的单点条形图。facet_wrap

到目前为止,我只得到了每个变量的五点线图的小面图。 我试图添加条形图(代码中显示),但结果却消失了。

这是数据集的子集

library(ggplot2)

facetperiodmean <- structure(list(phen = c("GS0", "GS1", "GS2", "GS3", "H", "GS0", 
"GS1", "GS2", "GS3", "H", "GS0", "GS1", "GS2", "GS3", "H", "GS0", 
"GS1", "GS2", "GS3", "H"), var = c("mz31_flux", "mz31_flux", 
"mz31_flux", "mz31_flux", "mz31_flux", "mz33_flux", "mz33_flux", 
"mz33_flux", "mz33_flux", "mz33_flux", "mz39_flux", "mz39_flux", 
"mz39_flux", "mz39_flux", "mz39_flux", "mz42_flux", "mz42_flux", 
"mz42_flux", "mz42_flux", "mz42_flux"), value = c(-0.0019661978021978, 
-0.00308365560165975, -0.00142552201933405, -0.00296758288770053, 
0.00716088983050848, -0.0201807203084833, 0.00699548966597077, 
0.2982090471597, 0.763140160427808, 0.0115715254237288, 0.00969123297732893, 
-0.00171052598693697, 0.292541864951768, 0.660130481283422, 0.00825954802259888, 
-0.000685986850921274, -0.000174803516028957, -0.00120851710610932, 
0.00190823529411765, 0.00197547090395481), err = c(0.0018197542356471, 
0.00193485421273063, 0.00171100912064672, 0.0078142824736682, 
0.000572623655079707, 0.00891612382048675, 0.00865982415221607, 
0.0261407868072828, 0.150893410160645, 0.000915642610907682, 
0.00930308482712752, 0.0152763210173861, 0.0419053150085817, 
0.160356398727679, 0.00153078001050311, 0.000743192090385591, 
0.00108257092872938, 0.00109911506984063, 0.00586547846096966, 
0.000166849869755912), tot = c(-0.000531297508180212, NA, NA, 
NA, NA, 0.104295388186188, NA, NA, NA, NA, 0.104717855718061, 
NA, NA, NA, NA, -9.02923940837303e-05, NA, NA, NA, NA)), row.names = c(NA, 
20L), class = "data.frame")

到目前为止,代码试图在图的中间刻面一个点条形图

ggplot(facetperiodmean,aes(x=phen,y=value,group=1))+
  geom_point(aes(colour=var),shape = 21, fill='darkolivegreen4',color='black',size = 1)+
  geom_line(color='darkolivegreen4', size = 0.5)+
  geom_errorbar(aes(ymin=value-err, ymax=value+err), width=0.5,
                position=position_dodge(0.9),color="darkolivegreen4")+
  ggplot(facetperiodmean,aes(x=phen,y=tot))+
  geom_bar(fill='darkolivegreen4',colour="black", stat="identity",width = 5,position=position_dodge(width = 20)) +
  facet_wrap(~var,scales="free_y")

我期待像我所附的人物这样的东西。An example of the output that I wish to get

r ggplot2 条形 线图

评论

0赞 Johannes Stötzer 9/4/2019
嗨,我看到你正在履行你的职能。这是故意的吗?ggplot()
0赞 Antonio Manco 9/4/2019
@JohannesStötzer我用代码报告了我的最后一次尝试,因为我正在尝试根据需要添加条形图。

答:

1赞 Chris 9/4/2019 #1

想出一个动态解决方案有点困难,因为你真正想要的是条形图的辅助 X 轴(因为条形图和线条自然不会位于同一个 X 轴上)。

解决方法是手动指定绘图的中间值(在本例中,中间 x 值为 ),并将条形的宽度设置为 5 以覆盖整个轴。GS2

ggplot(facetperiodmean,aes(x=phen,y=value,group=1))+
  geom_bar(aes(x='GS2', y = tot), fill='darkolivegreen4',colour="black",
           stat="identity",position='dodge', width = 5) +
  geom_errorbar(aes(ymin=value-err, ymax=value+err), width=0.5, 
                position=position_dodge(0.9),colour="darkolivegreen4")+
  geom_line(colour="black", size = 0.5)+
  geom_point(aes(colour=var),shape = 21, fill='darkolivegreen4',color='black',size = 1)+
  facet_wrap(~var,scales="free_y")

enter image description here

编辑:

下面是用于创建图例的附加代码。我不确定您想要如何使用条形图/线条,因此我留下了可以替换的占位符名称。

ggplot(facetperiodmean,aes(x=phen,y=value,group=1))+
  geom_bar(aes(x='GS2', y = tot, fill='Bar Label'),colour="black",
           stat="identity",position='dodge', width = 5) +
  geom_errorbar(aes(ymin=value-err, ymax=value+err), width=0.5, 
                position=position_dodge(0.9),colour="darkolivegreen4")+
  geom_line(aes(colour="line label"), size = 0.5)+
  geom_point(aes(colour='line label'),shape = 21, fill='darkolivegreen4',size = 1)+
  facet_wrap(~var,scales="free_y") +
  scale_color_manual(values = c('#000000'))+
  scale_fill_manual(values = c('darkolivegreen4'))+
  theme(legend.position = 'bottom',
        legend.title = element_blank())

enter image description here

评论

0赞 Antonio Manco 9/4/2019
谢谢。这是我的预期结果!谢谢
0赞 Antonio Manco 9/4/2019
对不起@Chris。现在,我正试图为两种不同的美学添加一个独特的传奇。但是我不能添加图例,使用与美学和“scale_color_manual”细节中更正“颜色”功能相同的代码。你能帮我吗?非常感谢。
1赞 Antonio Manco 9/5/2019
谢谢@Chris!现在它起作用了!我明白我的错误,我必须使用“填充”而不是“颜色”,因为条形图美学必须避免美学之外的“颜色”和“填充”功能。谢谢!
0赞 Antonio Manco 10/17/2019
嗨,@Chris。我必须再次请求你的帮助。我想添加显著性水平或整个平均值(条形图),如您在我在问题中提供的示例图像中看到的那样。我试过了,但它不起作用。不要什么都不做。你可以帮我吗?有什么建议吗?谢谢state_compare_means
0赞 Chris 10/18/2019
嗨,我不完全确定你希望它是什么样子。你能试着问一个新问题,明确你想要实现的目标吗?
1赞 Jon Spring 9/4/2019 #2

下面是一个使用 的方法,其中我们指定所有矩形都应从最小值跨越到最大值:geom_rectphen

ggplot(facetperiodmean,aes(x=phen,y=value,group=1))+
  geom_rect(aes(xmin = min(phen), xmax = max(phen),
                ymin = 0, ymax = tot), fill='darkolivegreen4',colour="black", 
           stat="identity",width = 0.9, alpha = 0.3,
           position=position_dodge(width = 20)) +
  geom_point(aes(colour=var),shape = 21, fill='darkolivegreen4',color='black',size = 1)+
  geom_line(color='darkolivegreen4', size = 0.5) +
  geom_errorbar(aes(ymin=value-err, ymax=value+err), width=0.5,
                position=position_dodge(0.9),color="darkolivegreen4") +
  facet_wrap(~var,scales="free_y")

enter image description here

评论

0赞 Antonio Manco 9/4/2019
谢谢!这是一个有效的替代方法。我正在考虑geom_rect,但我无法以正确的方式将其添加到代码中。