叠加ggplots:相同分组但不同数据的错误栏

时间:2017-09-17 18:05:10

标签: r ggplot2

如何覆盖以下两个图,第一个保持颜色定义为-is,第二个图提供黑色参考线/错误栏。我无权访问原始数据。

编辑:来自同一c段的黑色和彩色误差条应具有相同的横坐标。不同c段的横坐标应偏移position_dodge

我已经尝试过geom_step(),然后是plot1 + plot2,它最接近我想去的地方,但是我放松了第二个地块的布局。

library(dplyr)
library(ggplot2)

dta.str <- "G,C,P,y,ci
A,d,III,166.856088,34.719594
A,d,I,190.748296,37.181357
A,d,II,241.645888,47.168545
A,e,III,121.719736,28.456342
A,e,I,157.062248,36.273819
A,e,II,205.818768,48.619195
A,n,III,23.9916,8.624696
A,n,I,28.104488,7.401821
A,n,II,41.369656,10.522883
B,d,III,171.418816,14.739214
B,d,I,201.753368,16.673325
B,d,II,266.013168,21.616907
B,e,III,145.256352,10.781806
B,e,I,164.20732,11.317529
B,e,II,220.398488,15.320057
B,n,III,28.424464,3.211746
B,n,I,28.857352,3.106672
B,n,II,40.594432,4.191482"

dta <- read.csv( text=dta.str )

pd <- position_dodge(0.1) # if 0.1, move them .05 to the left and right

p <- ggplot( dta %>% filter( G == "A") , aes(x = P, y = y , colour = C )) + 
      geom_errorbar(aes(ymin=y-ci, ymax=y+ci), width=.1 , position=pd) +
      geom_line(position=pd,aes(group=C)) +
      geom_point(position=pd)

p <- p + ggplot( data = dta %>% filter( G == "B") , aes(x = P, y = y , colour = C  )) + 
      geom_errorbar(aes(ymin=y-ci, ymax=y+ci), width=.1 , position=pd) +
      geom_line(position=pd,aes(group=C) ) +
      geom_point(position=pd)

3 个答案:

答案 0 :(得分:0)

如果我理解正确,我想你只想要这个:

p <- ggplot( dta %>% filter( G == "A") , aes(x = P, y = y , colour = C, group = C )) + 
        geom_errorbar(aes(ymin=y-ci, ymax=y+ci), width=.1 , position=pd,color="black") +
        geom_line(position=pd,aes(group=C)) +
        geom_point(position=pd)

您似乎需要明确定义C作为position_dodge的分组变量,以便始终如一地应用。

enter image description here

答案 1 :(得分:0)

听起来你想要一个包含以下内容的情节:

  • 点数:按变量C(&#34; d&#34;,&#34; e&#34;,&#34; n&#34;)为G == "A"G = "B";
  • 行:按变量分组C&amp; G,并为C的变量G == "A"着色,同时为colour == "black"保留G == "B";
  • 错误栏:为C的变量G == "A"着色,同时为colour = "black"保留G == "B";
  • 点,线和&amp; P(在x轴上)的每个值的误差条,具有相同的C值,应该被躲避到相同的范围。

如果是这样的话,主要的困难在于为点和线/误差条定义两个不同的调色板,当我们只有一个scale_colour_XXX可以玩时。我在下面采用了一种解决方法,它依赖于某些形状接受fillcolour的美学映射这一事实:

# define fill / colour palette outside the ggplot object
n.colors = length(levels(dta$C))
fill.palette = RColorBrewer::brewer.pal(n.colors, "Set1") # change palette here
colour.palette = c(fill.palette, rep("black", n.colors))
names(fill.palette) <- levels(dta$C)
names(colour.palette) <- levels(interaction(dta$C, dta$G))

# plot
ggplot(dta,
       aes(x = P, y = y, fill = C, colour = interaction(C, G), group = C)) +
  geom_errorbar(aes(ymin = y-ci, ymax = y+ci), width = 0.1, position = pd) +
  geom_line(data = subset(dta, G == "A"), position = pd) +
  geom_line(data = subset(dta, G == "B"), position = pd) +
  geom_point(shape = 21, color = "white", size = 3, position = pd) +
  scale_fill_manual(values = fill.palette) +
  scale_colour_manual(values = colour.palette, guide = F)

geom_line()的每个值绘制单独的G,因为我们仅按C进行分组(以保持G的不同值的相同闪避位置)。

plot

答案 2 :(得分:0)

这就是我想出来的。我确信这是一种更优雅的方法。

ggplot( data = dta %>% filter( G == "A" ) , 
        aes(x = P, y = y , colour = C , group = C )) + 
      geom_errorbar(aes(ymin=y-ci, ymax=y+ci), width=.1 , position=pd) +
      geom_line(position=pd,aes(group=C)) +
      geom_point(position=pd) +
geom_line( 
  data = dta %>% filter( G == "B" ) , 
  aes(x = P, y = y , colour = c, group = C), colour = "black" , position=pd ) +
geom_errorbar(
  data = dta %>% filter( G == "B" ),
  aes(ymin=y-ci, ymax=y+ci), width=.1 , position=pd, color="black") +
geom_point(
  data = dta %>% filter( G == "B" ) , 
  position=pd,color="black")