仅在 ggplot2 的重叠处闪避或抖动

Posted

技术标签:

【中文标题】仅在 ggplot2 的重叠处闪避或抖动【英文标题】:dodge or jitter only at overlaps in ggplot2 【发布时间】:2016-06-30 16:12:38 【问题描述】:

我想在 ggplot2 中绘制一个图,其值与中心对齐但在重叠处避开,就像这个(在 graphpad prism 中完成)

.

我可以在 ggplot2 中使用 jitter 做什么看起来像这样

df<-data.frame(response=c(-0.3502294,0.4207441,0.1001638,-0.2401336,-0.2604142,0.4574286,
       0.755964,0.9241669,0.8212376,2.037581,0.6440635,0.2714898,1.433149,0.4627742,
       0.5639637,0.1610219,0.1516505,-1.322015,-0.2134711,0.8554756,0.400872,1.344739,
       0.3743637,0.6329151,0.1467015,0.6313575,0.3989693,0.1940468,-0.06594919,-0.1951204),
    group=c(rep("A",10),rep("B",10),rep("C",10)))

set.seed(1234)
ggplot(df,aes(group,response,fill=group))+
  geom_point(size=5,pch=21,position=position_jitter(w=.2))+
  scale_y_continuous(limits=c(-2,3))

.

如何保持点与中心对齐并仅在 ggplot2 中的重叠处闪避?

【问题讨论】:

【参考方案1】:

我对您的问题的解决方案是:

    将数据分为重叠点和非重叠点。这可以通过计算先前点之间的差异来完成。如果它小于某个阈值,则该点与某个点重叠,因此应在绘制该点时应用一些 zitter。否则,该点将照此绘制。 使用 geom_point 分别绘制两个数据。

下面是代码,使用上面的逻辑。

library(data.table)

threshold <- 0.1

df<-data.frame(response=c(-0.3502294,0.4207441,0.1001638,-0.2401336,-0.2604142,0.4574286,
       0.755964,0.9241669,0.8212376,2.037581,0.6440635,0.2714898,1.433149,0.4627742,
       0.5639637,0.1610219,0.1516505,-1.322015,-0.2134711,0.8554756,0.400872,1.344739,
       0.3743637,0.6329151,0.1467015,0.6313575,0.3989693,0.1940468,-0.06594919,-0.1951204),
    group=c(rep("A",10),rep("B",10),rep("C",10)))

df1 <- data.table(df[order(df$group, df$response),])
df1[, diffFromLast:=response - shift(response, n=1, type="lag"), by=group]
nonZitterPoints <- df1[ is.na(diffFromLast) | (diffFromLast > threshold),]
zitterPoints <- df1[ which(diffFromLast < threshold),]

g1 <- ggplot()+
       geom_point(data=nonZitterPoints,aes(group,response,fill=group), size=5,pch=21)+
       scale_y_continuous(limits=c(-2,3))
g1

g2 <- g1 + geom_point(data=zitterPoints,aes(group,response,fill=group), size=5,pch=21, position=position_jitter(w=.2))

g2

【讨论】:

这是否回答了你的问题@RBA? 这是一个可能的解决方案,但这不是我想要的。我希望将重叠(并且会抖动)的点之一居中,并使用您的解决方案将所有这些点放在抖动带它们的地方。一定有办法对它们进行排名......但无论如何感谢@Kumar

以上是关于仅在 ggplot2 的重叠处闪避或抖动的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2和一组抖动/闪避点

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

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

更改 ggplot2 barplot 中闪避条的顺序

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

如何使ggplot2中的可变条宽不重叠或间隙