首页 > 解决方案 > 分类尺度上 geom_point 的 position_dodge 的垂直等效项

问题描述

当我有一个分类 y 变量时,我想垂直避开重叠的 geom_point。

library(tidyverse)
# all possible points
df <- expand.grid(
  y_factor = paste0('factor_',1:5),
  x =1:100
)%>%as.tbl

# randomly missing and overlapping points
# every green point has a pink point underneath, and every blue point 
# has a green point underneath it.
seed<-1
df_with_overlap<-df%>%
  sample_frac(0.5,replace = TRUE)%>%
  group_by(y_factor,x)%>%
  mutate(n=factor(1:n()))
p<-ggplot(data=df_with_overlap, aes(x=x, y=y_factor, col=n))
p+geom_point()

no_dodge

使用水平躲避position_dodge不起作用,因为该轴上的数据太拥挤,所以有些点仍然重叠,可视化不清晰。

p+geom_point(position=position_dodge(width=1))+
  ggtitle('position_dodge isnt what Im looking for. 
          \nx-axis too crowded and points still overlap')

position_dodge

position_jitter有点工作,因为我可以将 x jitter 限制为 0,并控制 y jitter 的程度。但是抖动的随机性使其不那么吸引人。当它们存在时,我可以辨认出这三种颜色。

p+geom_point(aes(col=n), position=position_jitter(width=0, height=0.05))+
  ggtitle('Jitter kind of works.
          \nIt would work better if it wasnt random
          \nlike position_dodge, but vertical dodging')

位置抖动

有没有办法垂直躲避点?

标签: rggplot2

解决方案


感谢@aosmith 的建议ggstance::position_dodgev()。这正是我一直在寻找的。我增加了过采样,所以效果更明显。

df <- expand.grid(
  y_factor = paste0('factor_',1:5),
  x =1:100
)%>%as.tbl

seed<-1
df_with_overlap<-df%>%
  sample_frac(1.5,replace = TRUE)%>%
  group_by(y_factor,x)%>%
  mutate(n=factor(1:n()))

ggplot(data=df_with_overlap, aes(x=x, y=y_factor, col=n))+
  geom_point(position=ggstance::position_dodgev(height=0.3))

回答


推荐阅读