R语言ggplot2定义因子水平后drop=FALSE参数失效如何解决
问题修复方案
问题根源
问题出在geom_point的映射逻辑中:你已经提前将df_roles$role转换为包含全部7个水平的因子,但在aes(colour = factor(role))中又对role额外套了一次factor()函数,这会重新生成仅保留数据中现存水平的新因子,覆盖了你之前定义的全量水平,所以drop=FALSE没有作用对象自然不生效。
修复代码
只需要把aes里的多余factor()去掉,直接使用提前处理好的role变量即可:
library(ggplot2) library(dplyr) df_roles$role <- factor(df_roles$role, levels = c("Ultra peripheral", "Peripheral", "Connector", "Kinless", "Provincial", "Connector Hub", "Kinless Hub")) g1 <- df_roles %>% ggplot(aes(participation, connectivity, label = NA)) + # 移除多余的factor()包装,直接使用预处理完成的role变量 geom_point(aes(colour = role)) + scale_color_manual(values = c("Ultra peripheral" = "#440154", "Peripheral"="#3F4286", "Connector"="#29778D", "Kinless"="#1EA682", "Provincial"="#1EA667", "Connector Hub"="#7BD252", "Kinless Hub"="#FDE721"),drop = FALSE) # 输出验证 g1
可选兼容写法
如果不方便提前处理数据框的因子水平,也可以在aes内显式指定factor的levels参数,drop=FALSE同样会生效:
geom_point(aes(colour = factor(role, levels = c("Ultra peripheral","Peripheral","Connector","Kinless","Provincial","Connector Hub","Kinless Hub"))))
修改后运行代码,图例就会完整展示所有7个预先定义的因子水平,哪怕对应类别没有实际数据点也会保留。
内容的提问来源于stack exchange,提问作者MoonS
相关产品推荐
相关产品推荐

