ggplot2 - 抖动和位置闪避一起

Posted

技术标签:

【中文标题】ggplot2 - 抖动和位置闪避一起【英文标题】:ggplot2 - jitter and position dodge together 【发布时间】:2012-05-16 14:38:56 【问题描述】:

我正在尝试从 GGplot2 研讨会 http://dl.dropbox.com/u/42707925/ggplot2/ggplot2slides.pdf 重新创建一个图形。

在这种情况下,我正在尝试生成示例 5,其中抖动的数据点会受到闪避。当我运行代码时,这些点以正确的线为中心,但没有抖动。

这是直接来自演示文稿的代码。

set.seed(12345)
hillest<-c(rep(1.1,100*4*3)+rnorm(100*4*3,sd=0.2),
       rep(1.9,100*4*3)+rnorm(100*4*3,sd=0.2))
rep<-rep(1:100,4*3*2)
process<-rep(rep(c("Process 1","Process 2","Process 3","Process 4"),each=100),3*2)
memorypar<-rep(rep(c("0.1","0.2","0.3"),each=4*100),2)
tailindex<-rep(c("1.1","1.9"),each=3*4*100)
ex5<-data.frame(hillest=hillest,rep=rep,process=process,memorypar=memorypar, tailindex=tailindex)
stat_sum_df <- function(fun, geom="crossbar", ...) stat_summary(fun.data=fun, geom=geom, ...) 

dodge <- position_dodge(width=0.9) 
p<- ggplot(ex5,aes(x=tailindex ,y=hillest,color=memorypar)) 
p<- p + facet_wrap(~process,nrow=2) + geom_jitter(position=dodge) +geom_boxplot(position=dodge)  
p

【问题讨论】:

鉴于 Didzis Elferts 使用 ggplot2 1.0.0 版中提供的position_jitterdodge 提供了更好的答案,您应该不接受我的答案并接受 Didzis Elferts 提供的答案。 【参考方案1】:

ggplot2 版本1.0.0 中有一个名为position_jitterdodge() 的新职位是针对这种情况而设立的。该位置应在geom_point() 内使用,fill= 应在aes() 内使用以显示通过哪个变量来躲避您的数据。要控制躲避参数的宽度,应该使用dodge.width=

ggplot(ex5, aes(x=tailindex, y=hillest, color=memorypar, fill=memorypar)) +
      facet_wrap(~process, nrow=2) +
      geom_point(position=position_jitterdodge(dodge.width=0.9)) +
      geom_boxplot(fill="white", outlier.colour=NA, position=position_dodge(width=0.9))

【讨论】:

感谢您的这篇文章。这很有帮助。我目前正在编写自己的代码,运行良好。但是,我以某种方式得到了异常值的黑色。你能猜出可能是什么原因吗? 黑色是异常值的默认颜色。在此代码中,geom_boxplot() outlier.colour= 设置为 NA 以不显示它们。 嗨,我刚刚找到了解决方案。 outlier.colour 必须拼写为颜色,而不是颜色。看来美式咒语在这里并不受欢迎。感谢您的回复。 :-) @DidzisElferts, outlier.colour = NA 在 Rshiny/plotly 显示的情况下不起作用。有什么解决办法吗? 你也可以尝试使用颜色‘透明’【参考方案2】:

编辑ggplot2 版本 1.0.0 使用 position_jitterdodge 有更好的解决方案。请参阅@Didzis Elferts 的回答。注意dodge.width控制闪避的宽度,jitter.width控制抖动的宽度。

我不确定代码是如何在 pdf 中生成图表的。

但是这样的事情会让你接近你所追求的吗?

我将tailindexmemorypar 转换为数字;将它们加在一起;结果是geom_jitter 层的 x 坐标。可能有一种更有效的方法来做到这一点。另外,我想看看如何躲避geom_boxplotgeom_jitter,并且没有抖动,将在pdf 中生成图形。

library(ggplot2)
dodge <- position_dodge(width = 0.9)
ex5$memorypar2 <- as.numeric(ex5$tailindex) + 
  3 * (as.numeric(as.character(ex5$memorypar)) - 0.2) 

p <- ggplot(ex5,aes(x=tailindex , y=hillest)) +
   scale_x_discrete() +
   geom_jitter(aes(colour = memorypar, x = memorypar2), 
     position = position_jitter(width = .05), alpha = 0.5) +
   geom_boxplot(aes(colour = memorypar), outlier.colour = NA, position = dodge) +
   facet_wrap(~ process, nrow = 2)
p

【讨论】:

谢谢,我希望 ggplot2 中有一种优雅的方式,但这种解决方法可以完成所有工作。再次感谢!

以上是关于ggplot2 - 抖动和位置闪避一起的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2和一组抖动/闪避点

ggplot2 - 带有堆栈和闪避的条形图

更改 ggplot2 barplot 中闪避条的顺序

如何从 df 的不同列中获取闪避的 geom_bar (ggplot2)

如何在 ggplot2 中的 position_dodge 中将单个条形位置与多个条形居中

R语言ggplot2可视化抖动数据点使用ggplot2中的geom_jitter函数可视化抖动数据点防止数据重叠影响可视化效果添加主标题副标题