如何覆盖以下两个图,第一个保持颜色定义为-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)
答案 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
的分组变量,以便始终如一地应用。
答案 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"
; P
(在x轴上)的每个值的误差条,具有相同的C
值,应该被躲避到相同的范围。如果是这样的话,主要的困难在于为点和线/误差条定义两个不同的调色板,当我们只有一个scale_colour_XXX
可以玩时。我在下面采用了一种解决方法,它依赖于某些形状接受fill
和colour
的美学映射这一事实:
# 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
的不同值的相同闪避位置)。
答案 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")