ggplot中geom_point无法按自定义调色板为分组设置颜色
问题原因与解决方案
你的代码里有两个关键问题导致颜色不生效:
ggplot的aes中用了fill = group,但默认的geom_point()是通过color美学控制点的颜色,fill仅适用于带填充区域的点形状(比如带实心填充的圆形)。- 你调用了
scale_color_manual(),但这个函数对应color美学,和aes里的fill不匹配,所以自定义调色板没有被应用。
下面是两种可行的解决方法:
方法一:使用color美学(最常用)
修改aes中的映射为color = group,直接对应scale_color_manual():
library(tidyverse) num_points <- 10 series <- function(num_points) { cumsum(c(0, replicate(num_points-1, sample(c(-1,0,+1), 1)))) } num_particles <- 5 data_set <- function(num_points) { # 用map_dfr替代循环,更符合tidyverse风格 map_dfr(1:num_particles, ~tibble( x = series(num_points), y = series(num_points), group = as.factor(.x) )) } z <- data_set(num_points) group.colors <- c("#333BFF","#CC6600","#9633FF","#E2FF33","#E3DB71") ggplot(z, aes(x = x, y = y, group = group, color = group)) + geom_point() + scale_color_manual(values = group.colors)
方法二:使用fill美学(带填充的点形状)
如果需要用填充色,给geom_point()指定支持填充的形状(比如shape=21),同时替换为scale_fill_manual():
library(tidyverse) num_points <- 10 series <- function(num_points) { cumsum(c(0, replicate(num_points-1, sample(c(-1,0,+1), 1)))) } num_particles <- 5 data_set <- function(num_points) { map_dfr(1:num_particles, ~tibble( x = series(num_points), y = series(num_points), group = as.factor(.x) )) } z <- data_set(num_points) group.colors <- c("#333BFF","#CC6600","#9633FF","#E2FF33","#E3DB71") ggplot(z, aes(x = x, y = y, group = group, fill = group)) + # 指定带填充的形状,可自定义轮廓色和点大小 geom_point(shape = 21, color = "black", size = 2) + scale_fill_manual(values = group.colors)
内容的提问来源于stack exchange,提问作者John Garland
相关产品推荐
相关产品推荐

