如何用ggplot2重复绘制重复变量(避免转为因子并生成独立Y轴刻度)
解决方案:为重复名称创建独立的Y轴类别
我明白你的需求啦——你希望每个重复的Name在Y轴上都对应独立的刻度,而不是所有同名称的观测挤在同一个Y位置里。原来的reorder(Name, -Pos)会把相同Name的观测归为同一个Y类别,所以即使加了geom_jitter,它们也只是在同一刻度附近晃动,没法拥有独立的刻度位置。
要实现这个效果,我们可以先给每个观测创建一个唯一的名称标识,把重复的Name区分开,再用这个新标识作为Y轴的映射变量。具体步骤如下:
1. 处理数据,生成唯一名称
我们可以给重复的Name加上序号后缀,比如把第二个abc变成abc_2,第二个bcd变成bcd_2,这样每个观测都有独一无二的标识:
library(ggplot2) # 你的原始数据框 df <- data.frame(Name=c('abc', 'bcd', 'cde', 'bcd', 'abc', 'def'), Pos=c(1, 2, 3, 2, 4, 5)) # 生成唯一名称:给每个重复的Name添加序号 df$Unique_Name <- paste0(df$Name, "_", ave(seq_along(df$Name), df$Name, FUN = seq_along))
处理后的数据框会变成这样:
Name Pos Unique_Name
abc 1 abc_1
bcd 2 bcd_1
cde 3 cde_1
bcd 2 bcd_2
abc 4 abc_2
def 5 def_1
2. 绘制图表,使用唯一名称作为Y轴
现在用Unique_Name映射Y轴,每个观测就会对应独立的Y刻度了。如果希望Y轴的标签只显示原始的Name(不带序号后缀),可以用scale_y_discrete调整标签:
ggplot(df, aes(Pos, Unique_Name)) + geom_point(size = 3) + # 用geom_point就足够,不需要jitter,因为不会重叠 # 把Y轴标签的序号去掉,只保留原始Name scale_y_discrete(labels = function(x) gsub("_\\d+$", "", x)) + labs(y = "Name", x = "Position") + theme_bw()
效果说明
这样绘制出来的图表中:
bcd会有两个独立的Y刻度位置,分别对应它的两个观测(Pos=2)abc也会有两个独立的Y刻度,分别对应Pos=1和Pos=4的观测- 其他唯一的
Name(cde、def)则各自对应一个刻度
如果你的需求是保留序号在Y轴标签里,只需要去掉scale_y_discrete那一行即可。
内容的提问来源于stack exchange,提问作者hmg
相关产品推荐
相关产品推荐

