如何为含2个以上分类的geom_jitter交替复用两种配色
问题原因
你之前的代码不生效是因为scale_color_manual的values参数需要和映射的因子(也就是factor(location))的水平数量完全匹配,直接调用rep(c("red","green"))没有指定输出长度,仅会生成长度为2的向量,当location分类数超过2时无法完成匹配,所以不生效。
通用解决方案
两种方法都可以实现无需手动逐个指定颜色,适配任意数量的location分类:
方法1:直接指定循环颜色的输出长度
在rep函数中增加length.out参数,取值为location的因子水平总数即可:
ggplot(data=dat1, aes(name, value, colour=factor(location)))+ geom_jitter() + scale_color_manual(values = rep(c("red", "green"), length.out = nlevels(factor(dat1$location))))
方法2:新增奇偶分组辅助列(适配更复杂的自定义逻辑)
如果后续需要调整颜色规则,可先按照location的顺序生成奇偶标记,将颜色映射到该标记,同时保留原始location作为图例标签:
# 先固定location的因子顺序,保证交替顺序符合预期,levels可根据需求自定义 dat1$location <- factor(dat1$location, levels = unique(dat1$location)) # 生成交替分组列 dat1$color_group <- as.integer(dat1$location) %% 2 # 绘图 ggplot(data=dat1, aes(name, value, colour=factor(color_group)))+ geom_jitter() + scale_color_manual(values = c("0" = "red", "1" = "green"), name = "location", # 图例标题和原始字段保持一致 labels = levels(dat1$location)) # 图例标签用原始location取值
注意事项
如果需要严格按照你数据中location出现的顺序交替颜色,一定要手动指定location的因子水平,避免默认按字母排序导致颜色顺序不符合预期。
内容的提问来源于stack exchange,提问作者Lila McPhee
相关产品推荐
相关产品推荐

