如何在ggplot2中仅保留School3对应的图例,移除其余图例?
解决仅保留指定图例项的分组柱状图问题
嘿,我明白你想只保留School3对应的2Male和2Female图例、去掉其他两项的需求啦。之前用两个geom_bar的方法没生效,是因为即使你在第一个图层隐藏了图例,第二个图层的fill类别还是会和第一个的合并,导致所有图例都显示。其实更简单的方法是直接在scale_fill_manual里指定breaks参数,只保留你想要的图例项就行!
你的数据结构
先确认下你的数据框结构(方便复现场景):
data2 <- structure(list( School = structure(c(1L, 1L, 2L, 2L, 3L, 3L), .Label = c("School1", "School2", "School3"), class = "factor"), Gender = structure(c(2L, 1L, 2L, 1L, 2L, 1L), .Label = c("Female", "Male"), class = "factor"), Value = c(10L, 30L, 40L, 70L, 5L, 90L), ColorGroup = structure(c(2L, 1L, 2L, 1L, 4L, 3L), .Label = c("1Female", "1Male", "2Female", "2Male"), class = "factor") ), .Names = c("School", "Gender", "Value", "ColorGroup"), row.names = c(NA, -6L), class = "data.frame")
正确的实现代码
你只需要在原来的scale_fill_manual里加上breaks = c("2Male", "2Female"),就能只保留这两个图例项,同时所有柱子的颜色还是按照你定义的cols33映射:
library(ggplot2) cols33 <- c("1Male" = "yellow", "1Female" = "orange", "2Male" = "red", "2Female" = "blue") ggplot(data=data2, aes(x=School, y=Value, group = Gender, fill = ColorGroup)) + geom_bar(stat = "identity", position = position_dodge(), width = 0.5) + scale_fill_manual( name = "", values = cols33, breaks = c("2Male", "2Female") # 仅保留这两个图例项 )
为什么这个方法有效?
breaks参数的作用就是指定哪些类别需要在图例中显示,即使这些类别对应的颜色已经在values里定义了,没被包含在breaks里的就不会出现在图例中。- 这样你不需要拆分图层,只用一个
geom_bar就能完成所有柱子的绘制,同时精准控制图例显示的内容,比之前的方法更简洁可靠。
如果你还想调整图例的顺序或者自定义标签,也可以在scale_fill_manual里配合labels参数一起使用哦!
内容的提问来源于stack exchange,提问作者Vik G
相关产品推荐
相关产品推荐

