R ggplot按数据框列设置线条颜色及自定义分组样式问题
问题解决代码及说明
问题1:直接对因子/字符变量做条件判断
dplyr的if_else()、case_when()原生支持因子、字符类型的逻辑匹配,不需要转成数值,直接匹配变量的实际取值即可,写法更直观也避免因子水平顺序变动带来的bug。示例代码如下:
library(dplyr) library(ggplot2) # 双分类场景:直接用因子值判断,无需转数值 tmp <- iris %>% mutate(Clr = if_else(Species == "setosa", "Setosa", "Others")) # 三分类场景:用case_when给三个物种分别设置对应标签 tmp_3cat <- iris %>% mutate(Clr = case_when( Species == "setosa" ~ "setosa类", Species == "versicolor" ~ "versicolor类", Species == "virginica" ~ "virginica类" ))
问题2:指定颜色、调整图例
之前颜色不符合预期的原因是:你把存了"red"/"grey"的Clr变量传给了color美学映射,ggplot会把这两个值当成离散分类的标签,默认调用内置调色板取色,而不是直接用字符串对应的颜色。要实现自定义色值+自定义图例,配合scale_color_manual()设置即可,同时可以同步自定义线宽、线型满足你的基准线样式需求,完整代码如下:
ggplot(tmp, aes(x = Sepal.Length, y = Sepal.Width)) + # 同时映射颜色、线宽、线型 geom_line(aes(group = Species, colour = Clr, linewidth = Clr, linetype = Clr)) + # 自定义颜色映射 scale_color_manual( name = "结果类型", # 图例标题 values = c("Setosa" = "red", "Others" = "grey"), # 分类标签对应实际色值 labels = c("Setosa" = "基准模型", "Others" = "模拟输出结果") # 自定义图例显示文本 ) + # 自定义线宽映射 scale_linewidth_manual( name = "结果类型", values = c("Setosa" = 1.2, "Others" = 0.6), labels = c("Setosa" = "基准模型", "Others" = "模拟输出结果") ) + # 自定义线型映射 scale_linetype_manual( name = "结果类型", values = c("Setosa" = "solid", "Others" = "dashed"), labels = c("Setosa" = "基准模型", "Others" = "模拟输出结果") )
三个scale的name、labels参数保持一致时,ggplot会自动合并三个美学映射的图例,不会分开显示。如果希望直接用变量中存储的色值渲染,也可以用scale_color_identity()实现:
tmp2 <- iris %>% mutate(Clr = if_else(Species == "setosa", "red", "grey")) ggplot(tmp2, aes(x = Sepal.Length, y = Sepal.Width)) + geom_line(aes(group = Species, colour = Clr)) + scale_color_identity( name = "结果类型", labels = c("red" = "基准模型", "grey" = "模拟输出结果"), guide = "legend" )
内容的提问来源于stack exchange,提问作者Markm0705
相关产品推荐
相关产品推荐

