使用ggplot2的fill映射时图例不显示的技术求助(pch=21散点图)
解决ggplot2中fill映射图例不显示的问题
嘿,我来帮你搞定这个图例不显示的问题!你遇到的核心问题是**scale_fill_manual的breaks参数设置错误**,导致ggplot无法把填充色和Species变量对应起来,自然就生成不了图例。
问题根源
你在scale_fill_manual里把breaks设成了颜色值("#D89000"这类),但实际上breaks应该对应fill映射的变量——也就是Species的类别(setosa、versicolor、virginica)。当ggplot找不到映射变量和breaks的对应关系时,就不会渲染图例了。
修正方案
下面给你两种可行的修正代码,第二种更简洁直观:
方案1:修正breaks参数
直接把breaks改成Species的类别值,和labels保持一致:
kleinebox <- ggplot(iris, aes(x=Petal.Length, y=Sepal.Length))+ geom_point(aes(fill=Species), colour="black", pch=21, size=4)+ scale_fill_manual( values = c("#D89000","#35A2FF","#FA62DB"), breaks = c("setosa", "versicolor", "virginica"), # 改为Species的类别 labels = c("setosa", "versicolor", "virginica") ) + theme(plot.title = element_text(hjust = 0.2, size=20), legend.position = "right")
方案2:使用命名向量(更推荐)
直接给values设置命名向量,把物种名称和颜色一一对应,这样连breaks和labels都可以省略,ggplot会自动识别生成图例:
kleinebox <- ggplot(iris, aes(x=Petal.Length, y=Sepal.Length))+ geom_point(aes(fill=Species), colour="black", pch=21, size=4)+ scale_fill_manual( values = c( "setosa"="#D89000", "versicolor"="#35A2FF", "virginica"="#FA62DB" ) ) + theme(plot.title = element_text(hjust = 0.2, size=20), legend.position = "right")
效果验证
修改后,图例会正常显示,同时你依然能保留pch=21带黑边的填充点,完美保证颜色对比度的需求。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

