ggplot2中geom_point自定义调色板颜色匹配异常问题求助
问题原因
你在ggplot的aes()里设置col = cols[num]时,ggplot会将这个表达式的结果识别为离散分类变量,自动套用ggplot默认的离散调色板,而非直接使用你自定义的颜色值,这就是颜色显示不符的核心原因。
解决方法
方法1:直接在aes外指定颜色(无需图例时用)
把颜色设置移出aes(),直接传入你预先分配好的颜色向量,让ggplot直接使用这些颜色值:
colfunc <- colorRampPalette(c("black", "#FFAFAF")) cols <- colfunc(41) df$cols <- cols[df$num] baseMap <- ggplot(data = world) + geom_sf(color = "black", fill = "grey") + geom_point(data = df, mapping = aes(x = lon, y = lat), color = df$cols) + # 颜色参数移到aes外部 xlab("Longitude") + ylab("Latitude") baseMap
方法2:使用scale_color_identity()(需要图例时用)
如果需要保留颜色对应的图例,保留aes内的颜色映射,再添加scale_color_identity()告诉ggplot直接使用传入的颜色值:
colfunc <- colorRampPalette(c("black", "#FFAFAF")) cols <- colfunc(41) baseMap <- ggplot(data = world) + geom_sf(color = "black", fill = "grey") + geom_point(data = df, mapping = aes(x = lon, y = lat, col = cols[num])) + scale_color_identity(guide = "legend", labels = df$num) + # 启用图例并自定义标签 xlab("Longitude") + ylab("Latitude") baseMap
补充说明
你用base绘图测试调色板正常,是因为base绘图的col参数直接接收颜色值;而ggplot的aes()内部是做变量映射逻辑,不是直接赋值颜色,这是两者的核心区别。
内容的提问来源于stack exchange,提问作者willpkay
相关产品推荐
相关产品推荐

