使用position_jitterdodge绘制点,并添加也被躲避的突出显示的点

时间:2017-07-03 13:26:50

标签: r ggplot2

我有一些数据x是分类的,y是数字,而color.var是我想要着色的另一个分类变量。我的目标是使用position_jitterdodge()绘制所有点,然后突出显示几个点,在它们之间画一条线,然后添加标签,同时确保这些突出显示的点与相应的点条对齐使用position_jitterdodge()绘制。当所有因素都存在于用于闪避的变量中时,突出显示的点会正确对齐,但在缺少某些因素时效果不佳。

最小(非)工作示例

library(ggplot2)

生成一些数据

d = data.frame(x = c(rep('x1', 1000), rep('x2', 1000)), 
               y = runif(n=2000, min=0, max=1), 
               color.var= rep(c('color1', 'color2'), 1000), 
               facet.var = rep(c('facet1', 'facet1', 'facet2', 'facet2'), 500))
head(d)
dd = d[c(1,2,3,4,1997,1998, 1999,2000),]
dd
df1 = dd[dd$color.var=='color1',] ## data for first  set of points, labels, and the line connecting them
df2 = dd[dd$color.var=='color2',] ## data for second set of points, labels, and the line connecting them
df1
dw = .75 ## Define the dodge.width

绘制所有点

以下是所有要点,使用position_jitterdodge()和美学填充分开。

ggplot() + 
  geom_point(data=d, aes(x=x, y=y, fill=color.var), position=position_jitterdodge(dodge.width=dw), size=3, alpha=1, shape=21, color='darkgray') + 
  facet_wrap(~facet.var) +
  scale_fill_manual(values=c( 'lightblue','gray'))+
  theme(axis.title = element_blank()) +
  theme(legend.position="top")

enter image description here

效果很好。

其他突出显示的要点。

这是相同的情节,添加了dd中的其他点。

ggplot() + 
  geom_point(data=d,  aes(x=x, y=y, fill =color.var), position=position_jitterdodge(dodge.width=dw), size=3, alpha=1, shape=21, color='darkgray') + 
  geom_point(data=dd, aes(x=x, y=y, color=color.var                                   ), position=position_dodge(width=.75), size=4   ) +
   geom_line(data=dd, aes(x=x, y=y, color=color.var, group=color.var                  ), position=position_dodge(width=.75), size=1   ) +
  geom_label(data=dd, aes(x=x, y=y, color=color.var, group=color.var, label=round(y,1)), position=position_dodge(width=.75), vjust=-.5) + 
  facet_wrap(~facet.var) +   
  scale_fill_manual(values=c( 'lightblue','gray'))+
  scale_color_manual(values=c( 'blue', 'gray40')) +
  theme(axis.title = element_blank())+
  theme(legend.position="top")

enter image description here

这就是我想要它的样子。但是,只有color.var变量的两个因子都在要突出显示的点集中时,这才能正常工作。 如果新数据中不存在这两个因素,则水平对齐失败。

突出显示点,只有一个因素

以下是仅存在'color1'因子(蓝色)的示例。请注意,此代码中data=dd已替换为data=df1(仅包含蓝色突出显示的点的数据)。

ggplot() + 
      geom_point(data=d,  aes(x=x, y=y, fill =color.var), position=position_jitterdodge(dodge.width=dw), size=3, alpha=1, shape=21, color='darkgray') + 
      geom_point(data=df1, aes(x=x, y=y, color=color.var                                   ), position=position_dodge(width=.75), size=4   ) +
       geom_line(data=df1, aes(x=x, y=y, color=color.var, group=color.var                  ), position=position_dodge(width=.75), size=1   ) +
      geom_label(data=df1, aes(x=x, y=y, color=color.var, group=color.var, label=round(y,1)), position=position_dodge(width=.75), vjust=-.5) + 
      facet_wrap(~facet.var) +   
      scale_fill_manual(values=c( 'lightblue','gray'))+
      scale_color_manual(values=c( 'blue', 'gray40')) +
      theme(axis.title = element_blank())+
      theme(legend.position="top") +
      scale_x_discrete(drop=F)

enter image description here

蓝色和灰色点之间出现高亮蓝点,而不是与蓝点对齐。请注意,附加代码scale_x_discrete(drop=F)对比对没有明显影响。

手动解决方案

一种可能的解决方法是手动编辑x坐标,如此

 ggplot(data=d, aes(x=x, y=y)) + 
      geom_point(aes(fill=color.var), position=position_jitterdodge(dodge.width=dw), size=3, alpha=1, shape=21, color='darkgray') + 
      geom_point(data=df1, aes(x=as.numeric(x)-dw/4, y=y), alpha=.9, size=4 , color='blue') +            ## first set of points
      geom_line( data=df1, aes(x=as.numeric(x)-dw/4, y=y , group=color.var     ), color='blue', size=1) +    ## first line
      geom_label(data=df1, aes(x=as.numeric(x)-dw/4, y=y , label=round(y,1)), color='blue', vjust=-.25)+ ## first set of labels
      facet_wrap(~facet.var) +   
      scale_fill_manual(values=c( 'lightblue','gray'))+
      theme(axis.title = element_blank() +
      theme(legend.position="top")

enter image description here

调整dodge.width的1/4似乎有效。这样做很好,但似乎应该有更好的方法,特别是因为我最终想用4-5组突出显示的点/线来完成这个,这些点/线可能都是相同的color.var,就像上面的蓝色'color1'因子。重复这4-5次将是麻烦的。我最终也想做5-10个不同的数字。我认为dodge.width * 1/4将始终有效,复制和粘贴可能会起作用,但想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:0)

这是基于@ aosmith评论的解决方案。基本上,只需在使用ggplot之前添加此代码:

library(dplyr) ## needed for group_by()
library(tidyr) ## needed for complete()
df1 = df1 %>% group_by(facet.var, x) %>% complete(color.var) 

这会为数据添加额外的行,以便存在color.var的所有级别。然后可以使用问题中给出的代码以及一些修复图例的小编辑:

ggplot() + 
  geom_point(data=d  , aes(x=x, y=y, fill =color.var), position=position_jitterdodge(dodge.width=dw), size=3, alpha=1, shape=21, color='darkgray', show.legend=T) + 
  geom_point(data=df1, aes(x=x, y=y, color=color.var                                   ), position=position_dodge(width=.75), size=4, show.legend=T   ) +
  geom_line( data=df1, aes(x=x, y=y, color=color.var, group=color.var                  ), position=position_dodge(width=.75), size=1, show.legend=F   ) +
  geom_label(data=df1, aes(x=x, y=y, color=color.var, group=color.var, label=round(y,1)), position=position_dodge(width=.75), vjust=-.5, show.legend=F) + 
  facet_wrap(~facet.var) +   
  scale_fill_manual( values=c( 'lightblue','gray'), name='Background dots', guide=guide_legend(override.aes = list(color=c('lightblue', 'gray')))) +
  scale_color_manual(values=c( 'blue', 'gray40')  , name='Highlighted dots') +
  theme(axis.title = element_blank())+
  theme(legend.position="top")+
  scale_x_discrete(drop=F)