仅在ggplot2中重叠时闪避或抖动

时间:2016-03-15 07:13:50

标签: r data-visualization ggplot2

我喜欢在ggplot2中创建一个绘图,其中的值与中心对齐但是在重叠处躲闪,就像这个(在graphpad棱镜中完成)

plot in graphpad prism

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

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))

plot in R with ggplot2

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

1 个答案:

答案 0 :(得分:1)

我的解决方案是:

  1. 将数据划分为重叠和非重叠点。这可以通过计算先前点之间的差异来完成。如果它小于某个阈值,那么该点与某个点重叠,因此应该应用一些zitter,同时绘制该点。否则该点就这样绘制。
  2. 使用geom_point分别绘制两个数据。
  3. 以下是使用上述逻辑的代码。

    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