如何在R中的ggplot2中躲避点

时间:2013-11-26 04:05:30

标签: r ggplot2 position

df = data.frame(subj=c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10), block=factor(rep(c(1,2),10)), acc=c(0.75,0.83,0.58,0.75,0.58,0.83,0.92,0.83,0.83,0.67,0.75,0.5,0.67,0.83,0.92,0.58,0.75,0.5,0.67,0.67))
ggplot(df,aes(block,acc,group=subj)) + geom_point(position=position_dodge(width=0.3)) + ylim(0,1) + labs(x='Block',y='Accuracy')

如何在水平方向上均匀地躲避对方? (我按照subj分组,以便让它躲闪,这可能不是正确的事情......)

2 个答案:

答案 0 :(得分:1)

我认为这可能是你想要的,尽管你现在已经解决了它。 希望它可以帮助其他人解决同样的问题。

一种简单的方法是使用geom_dotplot,如下所示:

ggplot(df,aes(x=block,y=acc)) + 
geom_dotplot(binaxis = "y", stackdir = "center", binwidth = 0.03)  + ylim(0,1) + labs(x='Block',y='Accuracy')

这看起来像这样:

geom_dotplot example

请注意,x(在这种情况下为块)必须是此工作的一个因素。

答案 1 :(得分:0)

如果它们不必完全水平对齐,可以使用geom_jitter快速完成这一操作。您不需要按subj。

分组

方法1 [更简单]:使用geom_jitter()

ggplot(df,aes(x=block,y=acc)) + geom_jitter(position=position_jitter(0.05)) + ylim(0,1) + labs(x='Block',y='Accuracy')

使用抖动宽度进行播放,以获得更大程度的抖动。

产生:

enter image description here

方法2:确定性地计算每行的抖动值

我们首先使用aggregate来计算重复条目的数量。然后在新的数据框中,对于每个重复的值,将其水平向左移动一个epsilon距离。

df$subj <- NULL #drop this so that aggregate works.

#a new data frame that shows duplicated values
agg.df <- aggregate(list(numdup=seq_len(nrow(df))), df, length)
agg.df$block <- as.numeric(agg.df$block) #block is not a factor
#      block  acc numdup
#1     2      0.50      2
#2     1      0.58      2
#3     2      0.58      1
#4     1      0.67      2
#...    
epsilon <- 0.02 #jitter distance

new.df <- NULL #create an expanded dataframe, with block value jittered deterministically
r <- 0
for (i in 1:nrow(agg.df)) {
  for (j in 1:agg.df$numdup[i]) {
    r <- r+1 #row counter in the expanded df
    new.df$block[r] <- agg.df$block[i]
    new.df$acc[r] <- agg.df$acc[i]
    new.df$jit.value[r] <- agg.df$block[i] - (j-1)*epsilon    
  }
}
new.df <- as.data.frame(new.df)
ggplot(new.df,aes(x=jit.value,y=acc)) + geom_point(size=2) + ylim(0,1)  + labs(x='Block',y='Accuracy') + xlim(0,3)

产生:

enter image description here