geom_segment如何从自定义调色板随机取色且无连续重复色
实现思路
你需要先生成符合「无连续重复」规则的随机颜色序列,再直接赋值给geom_segment的颜色参数即可,具体步骤如下:
步骤1:生成符合要求的随机颜色序列
先定义你的自定义调色板,再通过循环生成相邻颜色不重复的随机序列:
# 自定义调色板 custom_pal <- c("dodgerblue4", "darkolivegreen4", "darkorchid3", "goldenrod1") # 替换为你实际的线段总数量,也可以直接用nrow(你的线段数据框)获取 n_segment <- nrow(your_segment_data) # 生成无连续重复的随机色列表 rand_colors <- character(n_segment) # 第一个颜色随机取 rand_colors[1] <- sample(custom_pal, 1) # 后续每个颜色排除前一个颜色后再随机抽取 for (i in 2:n_segment) { rand_colors[i] <- sample(custom_pal[custom_pal != rand_colors[i-1]], 1) }
步骤2:给线段赋值颜色
注意不要把color参数放到aes()内部,aes()是用来做变量映射的,直接作为geom的参数传入即可:
ggplot(你的线段数据框) + geom_segment( aes(x = x_start, y = y_start, xend = x_end, yend = y_end), color = rand_colors ) # 后续可以继续加其他图层配置
如果你需要保留颜色图例,可以把生成的随机色作为数据框的一列,搭配scale_color_identity使用:
# 先把颜色存到数据框 你的线段数据框$rand_col <- rand_colors ggplot(你的线段数据框) + geom_segment( aes(x = x_start, y = y_start, xend = x_end, yend = y_end, color = rand_col) ) + scale_color_identity(guide = "legend")
之前方案失效原因
- 第一个方案把
hue放到aes()内部,ggplot会将其识别为映射规则,不会直接使用你生成的颜色值,所以无法生效 - 第二个方案用
as.factor(i)做映射,是按i的固定顺序匹配调色板的顺序,没有加入随机逻辑,所以颜色不会随机
内容的提问来源于stack exchange,提问作者GerryB
相关产品推荐
相关产品推荐

