R中的ggplo2:geom_segment显示与geom_line不同的行

时间:2017-08-07 15:58:15

标签: r ggplot2 line shape segment

说我有这个数据框:

treatment <- c(rep("A",6),rep("B",6),rep("C",6),rep("D",6),rep("E",6),rep("F",6))
year <- as.numeric(c(1999:2004,1999:2004,2005:2010,2005:2010,2005:2010,2005:2010))
variable <- c(runif(6,4,5),runif(6,5,6),runif(6,3,4),runif(6,4,5),runif(6,5,6),runif(6,6,7))
se <- c(runif(6,0.2,0.5),runif(6,0.2,0.5),runif(6,0.2,0.5),runif(6,0.2,0.5),runif(6,0.2,0.5),runif(6,0.2,0.5))
id <- 1:36
df1 <- as.data.table(cbind(id,treatment,year,variable,se))

df1$year <- as.numeric(df1$year)
df1$variable <- as.numeric(df1$variable)
df1$se <- as.numeric(df1$se)

正如我在上一个问题(draw two lines with the same origin using ggplot2 in R)中提到的,我想使用ggplot2以特定的方式显示我的数据。

我设法使用以下脚本:

y1 <- df1[df1$treatment=='A'&df1$year==2004,]$variable
y2 <- df1[df1$treatment=='B'&df1$year==2004,]$variable
y3 <- df1[df1$treatment=='C'&df1$year==2005,]$variable
y4 <- df1[df1$treatment=='D'&df1$year==2005,]$variable
y5 <- df1[df1$treatment=='E'&df1$year==2005,]$variable
y5 <- df1[df1$treatment=='E'&df1$year==2005,]$variable
y6 <- df1[df1$treatment=='F'&df1$year==2005,]$variable

p <- ggplot(df1,aes(x=year,y=variable,group=treatment,color=treatment))+
geom_line(aes(y = variable, group = treatment, linetype = treatment, color = treatment),size=1.5,lineend = "round") +
scale_linetype_manual(values=c('solid','solid','solid','dashed','solid','dashed')) +
geom_point(aes(colour=factor(treatment)),size=4)+
geom_errorbar(aes(ymin=variable-se,ymax=variable+se),width=0.2,size=1.5)+
guides(colour = guide_legend(override.aes = list(shape=NA,linetype = c("solid", "solid",'solid','dashed','solid','dashed'))))

p+labs(title="Title", x="years", y = "Variable 1")+
  theme_classic() +
scale_x_continuous(breaks=c(1998:2010), labels=c(1998:2010),limits=c(1998.5,2010.5))+
  geom_segment(aes(x=2004, y=y1, xend=2005, yend=y3),colour='blue1',size=1.5,linetype='solid')+
  geom_segment(aes(x=2004, y=y1, xend=2005, yend=y4),colour='blue1',size=1.5,linetype='dashed')+
  geom_segment(aes(x=2004, y=y2, xend=2005, yend=y5),colour='red3',size=1.5,linetype='solid')+
  geom_segment(aes(x=2004, y=y2, xend=2005, yend=y6),colour='red3',size=1.5,linetype='dashed')+
  scale_color_manual(values=c('blue1','red3','blue1','blue1','red3','red3'))+
  theme(text = element_text(size=12))

如您所见,我使用geom_line和geom_segment来显示图表的线条。

figure

这几乎是完美的但是如果仔细观察,绘制的片段(2004年和2005年之间)不会显示相同的行大小,即使我在脚本中使用了相同的参数值(即size=1.5linetype='solid'dashed)。

当然我可以手动更改段的大小以获得类似的行,但是当我这样做时,段不像使用geom_line的行那样平滑。 此外,我通过在size参数中包含linetypeaes()参数来获得相同的问题(不同的线形)。

您是否知道造成这种差异的原因以及如何为我的细分和线条获得完全相同的形状?

1 个答案:

答案 0 :(得分:1)

这似乎是geom_segment的一个反锯齿问题,但这似乎是一个有点麻烦的方法开始。我想我已经通过在原始数据框中复制mean ,median & standard deviationA处理来解决您的问题。

B

这将为您提供以下enter image description here

我的数字不同,因为它们是随机生成的。

然后,您可以根据自己的喜好修改图例,但我的建议是使用# First we are going to duplicate and rename the 'shared' treatments library(dplyr) library(ggplot2) df1 %>% filter(treatment %in% c("A", "B")) %>% mutate(treatment = ifelse(treatment == "A", "AA", "BB")) %>% bind_rows(df1) %>% # This rejoins with the original data # Now we create `treatment_group` and `line_type` variables mutate(treatment_group = ifelse(treatment %in% c("A", "C", "D", "AA"), "treatment1", "treatment2"), # This variable will denote color line_type = ifelse(treatment %in% c("AA", "BB", "D", "F"), "type1", "type2")) %>% # And this variable denotes the line type # Now pipe into ggplot ggplot(aes(x = year, y = variable, group = interaction(treatment_group, line_type), # grouping by both linetype and color color = treatment_group)) + geom_line(aes(x = year, y = variable, linetype = line_type), size = 1.5, lineend = "round") + geom_point(size=4) + # The rest here is more or less the same as what you had geom_errorbar(aes(ymin = variable-se, ymax = variable+se), width = 0.2, size = 1.5) + scale_color_manual(values=c('blue1','red3')) + scale_linetype_manual(values = c('dashed', 'solid')) + labs(title = "Title", x = "Years", y = "Variable 1") + scale_x_continuous(breaks = c(1998:2010), limits = c(1998.5, 2010.5))+ theme_classic() + theme(text = element_text(size=12)) 之类的内容,然后务必设置geom_label

希望这有帮助!