如何在R语言ggplot2中通过自定义函数设置散点颜色
问题排查
你代码的核心问题有两个:
- 自定义的
get_point_color函数使用仅支持标量判断的if语句,但传入的mpg是长度为32的向量,if只会读取向量的第一个元素做判断,返回单一颜色,无法实现逐行匹配颜色的需求 - 直接在
geom_point的colour参数(非映射位)传入动态变量,不符合ggplot2的映射逻辑:要将变量关联到视觉属性时,对应参数必须放到aes()内部
修正方案
不需要单独写自定义函数,直接用dplyr::case_when生成分组后做颜色映射即可,两种常用写法如下:
写法1:直接绑定颜色值,无需额外映射
library(tidyverse) mtcars %>% # 提前生成对应颜色值 mutate(point_color = case_when( mpg <= 10 ~ "red", mpg > 10 & mpg <= 20 ~ "orange", mpg > 20 & mpg <= 50 ~ "blue" )) %>% ggplot(aes(mpg, disp)) + # 颜色变量放入aes内做映射 geom_point(aes(colour = point_color)) + # 直接使用字符串对应的颜色值,不做自动调色 scale_color_identity() + geom_smooth() + theme_bw()
写法2:生成分组标签,支持自定义图例
library(tidyverse) mtcars %>% # 生成区间标签 mutate(mpg_group = case_when( mpg <= 10 ~ "≤10", mpg > 10 & mpg <= 20 ~ "10~20", mpg > 20 & mpg <= 50 ~ "20~50" )) %>% ggplot(aes(mpg, disp)) + geom_point(aes(colour = mpg_group)) + # 手动绑定分组与颜色,同时设置图例名称 scale_color_manual( name = "mpg区间", values = c("≤10" = "red", "10~20" = "orange", "20~50" = "blue") ) + geom_smooth() + theme_bw()
内容的提问来源于stack exchange,提问作者Andrii
相关产品推荐
相关产品推荐

