使用ggplot绘制散点图时如何保留全部预设图例项?
问题原因
- 你的代码中美学映射用的是
color = class,但自定义色阶调用的是scale_fill_manual,二者不匹配,你设置的drop = FALSE参数没有作用在实际用到的color映射上 - 未将
class列显式定义为包含所有类别的因子,过滤数据后ggplot无法识别缺失的类别
修正后代码
library(tidyverse) for (iter in 1:5) { # 生成5个随机点 tbl <- tibble(x = runif(5), y = runif(5), # 显式定义class为因子,指定所有需要展示的层级 class = factor(c("A", "B", "C", "D", "E"), levels = c("A", "B", "C", "D", "E"))) # 仅渲染x>0.5的数据 p <- ggplot(data = tbl %>% filter(x > 0.5), aes(x = x, y = y, color = class)) + geom_point(size = 5) + # 改用scale_color_manual对应color映射,保留drop=FALSE scale_color_manual(labels = c("A", "B", "C", "D", "E"), values = c("Grey", "Red", "Green", "Blue", "Yellow"), drop = FALSE) + theme_bw() + theme(aspect.ratio = 1) + xlim(0, 1) + ylim(0, 1) ggsave(p, filename = paste0(iter, ".png")) }
关键修改说明
- 将
class列转为因子类型,显式指定levels为所有需要展示的类别,确保过滤后缺失的类别仍然被ggplot识别 - 把
scale_fill_manual替换为scale_color_manual,和aes里定义的color = class对应,此时drop = FALSE参数就会生效,即使某个类别没有对应数据也会保留在图例中
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

