如何在ggplot2图例中仅展示单一美学映射?
解决ggplot2图例的两个常见问题(基于mtcars数据集)
我来帮你搞定这两个ggplot2里的图例小麻烦,用mtcars数据集给你一步步演示清楚~
问题1:只保留color美学的图例,隐藏linetype的图例
当你同时用color和linetype做美学映射时,默认会显示两个图例。要只保留color的,有两种简单方法:
先构建基础示例图
首先我们把mtcars的cyl和am转成因子,方便做映射:
library(ggplot2) mtcars$cyl <- factor(mtcars$cyl) mtcars$am <- factor(mtcars$am) # 同时映射color和linetype的基础图 base_plot <- ggplot(mtcars, aes(x = hp, y = mpg, color = cyl, linetype = am)) + geom_line()
方法1:用guides()函数直接隐藏linetype图例
直接在基础图后加上guides(linetype = "none"),就能把linetype的图例去掉:
base_plot + guides(linetype = "none")
方法2:在scale层设置guide = FALSE
如果你是手动设置了scale_linetype,也可以直接在里面指定不显示图例:
base_plot + scale_linetype(guide = FALSE)
两种方法都能达到只显示color图例的效果。
问题2:用ifelse设置线宽后,图例出现奇怪的条件语句
这个问题的核心是混淆了「美学映射」和「直接参数设置」:如果把size放在aes()里,ggplot会把它当成一个需要映射的变量,自然会生成对应的图例;而我们只是想给某条线设置固定的粗度,不需要映射,所以别把size放进aes()里。
错误示例(会显示奇怪的图例)
# 错误:把size放进aes,导致图例显示ifelse语句 ggplot(mtcars, aes(x = hp, y = mpg, color = cyl)) + geom_line(aes(size = ifelse(cyl == "6", 2, 1)))
正确解决方法
方法1:分两次绘制线条(最直观)
先画普通粗细的线条,再单独画需要加粗的那条:
ggplot(mtcars, aes(x = hp, y = mpg, color = cyl)) + # 先画cyl不等于6的线,size=1 geom_line(data = subset(mtcars, cyl != "6"), size = 1) + # 再画cyl等于6的线,size=2 geom_line(data = subset(mtcars, cyl == "6"), size = 2)
这样图例只会显示color的分组,完全不会出现size相关的内容,线条粗细也符合要求。
方法2:用scale_size_manual控制(适合需要映射size但隐藏图例的场景)
如果你一定要用映射的方式,也可以手动指定size值,然后隐藏size的图例:
ggplot(mtcars, aes(x = hp, y = mpg, color = cyl, size = cyl)) + geom_line() + # 手动设置每个cyl对应的size,同时隐藏size图例 scale_size_manual(values = c("4" = 1, "6" = 2, "8" = 1), guide = "none")
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

