ggplot2中为何scale_fill_viridis_d会覆盖前置scale_fill_discrete设置?
根本原因
这是ggplot2的固定标度生效规则导致的:针对同一个美学属性的同类型标度配置,后写入的代码会完全覆盖先写入的设置,所有同类标度中只有最后一行会被真正应用。
具体到你的代码运行逻辑:
- 你连续叠加了两个针对
fill填充美学的离散型标度:- 先执行的
scale_fill_discrete(...),设置了自定义图例名Gender、替换三个分类的显示标签 - 后执行的
scale_fill_viridis_d(option = "E"),本身就是离散型fill的专用标度函数,和前一个discrete标度属于完全同类的配置
- 先执行的
- 因为后写入的viridis标度会顶替前一个标度的全部配置,你在
scale_fill_discrete中设置的图例名、标签都会被全部清空,最终只剩viridis的配色配置正常生效,也就是你观察到的现象。
正确实现方法
不要拆分成两个独立的fill标度写,把所有fill相关的自定义参数直接整合到viridis标度函数中即可,整合后的参考代码:
ggplot(dat, aes(x = mean_anxiety, fill = user_sex)) + geom_density(alpha = .3) + scale_x_continuous(name="Mean anxiety") + scale_y_continuous(name= "density") + scale_fill_viridis_d( option = "E", name = "Gender", labels = c("Female", "Male", "Non-binary") )
注意:传入
labels的顺序需要和user_sex的因子水平顺序严格匹配,避免出现标签和分类错位的问题。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

