You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggplot2 3.5.0+结合ggnewscale多分类填充图例异常求助

ggplot2 3.5.0与ggnewscale兼容问题:多fill图层保留未使用因子水平时出现黑色图例

我维护着一个用ggplot2展示脑成像数据的R包ggbrain,该包依赖ggnewscale实现多图层复用fill映射。在ggplot2 3.5.0之前,通过在scale_fill_*中设置drop=FALSE、仅对需隐藏图例的图层设show.legend=FALSE,可保留分类图例的未使用因子水平。但ggplot2 3.5.0发布后,需设置show.legend=TRUE才能保留未使用水平,导致后续图层覆盖之前的设置,出现无意义的全黑图例。我已尝试用gginnards查看对象,也按官方建议指定show.legend参数,但均无效果。


案例1:设show.legend=NA时,缺失水平未被绘制

data1 <- expand.grid(dim1=1:10, dim2=1:10)
data1$value1 <- rnorm(100)

data2 <- expand.grid(dim1=1:10, dim2=1:10)
data2$value2 <- factor(sample(c(NA, "f1", "f2", "f3", "f4"), size = 100, replace=TRUE), levels = paste0("f", 1:5))

data3 <- expand.grid(dim1=1:10, dim2=1:10)
data3$value3 <- factor(sample(c(NA, "i1", "i2", "i3", "i4"), size = 100, replace=TRUE), levels = paste0("i", 1:5))

ggplot(mapping=aes(x=dim1, y=dim2)) +
  geom_raster(data=data1, mapping=aes(fill=value1), show.legend = FALSE) +
  scale_fill_gradient(low = "grey8", high = "grey92") +
  ggnewscale::new_scale_fill() +
  geom_raster(data=data2, mapping=aes(fill=value2), show.legend=NA) +
  scale_fill_brewer("layer2", palette = "Set3", drop=FALSE, na.value = "transparent", na.translate=FALSE) +
  ggnewscale::new_scale_fill() +
  geom_raster(data=data3, mapping=aes(fill=value3), show.legend = NA) +
  scale_fill_brewer("layer3", palette = "Dark2", drop=FALSE, na.value = "transparent", na.translate=FALSE)

缺失水平显示为灰色的图像


案例2:按ggplot2 3.5.0+建议设show.legend=TRUE,破坏下层图层

ggplot(mapping=aes(x=dim1, y=dim2)) +
  geom_raster(data=data1, mapping=aes(fill=value1), show.legend = FALSE) + # 将变为fill_ggnewscale_2
  scale_fill_gradient(low = "grey8", high = "grey92") +
  ggnewscale::new_scale_fill() +
  geom_raster(data=data2, mapping=aes(fill=value2), show.legend=TRUE) +
  scale_fill_brewer("layer2", palette = "Set3", drop=FALSE, na.value = "transparent", na.translate=FALSE) + # 将变为fill_ggnewscale_1
  ggnewscale::new_scale_fill() +
  geom_raster(data=data3, mapping=aes(fill=value3), show.legend = TRUE) +
  scale_fill_brewer("layer3", palette = "Dark2", drop=FALSE, na.value = "transparent", na.translate=FALSE)

图例显示为黑色的错误图像


案例3:明确指定show.legend参数,仍无效果

ggplot(mapping=aes(x=dim1, y=dim2)) +
  geom_raster(data=data1, mapping=aes(fill=value1), show.legend = c(fill_ggnewscale_2=FALSE)) + # 将变为fill_ggnewscale_2
  scale_fill_gradient(low = "grey8", high = "grey92") +
  ggnewscale::new_scale_fill() +
  geom_raster(data=data2, mapping=aes(fill=value2), show.legend=c(fill_ggnewscale_1=TRUE)) +
  scale_fill_brewer("layer2", palette = "Set3", drop=FALSE, na.value = "transparent", na.translate=FALSE) + # 将变为fill_ggnewscale_1
  ggnewscale::new_scale_fill() +
  geom_raster(data=data3, mapping=aes(fill=value3), show.legend = c(fill=TRUE)) +
  scale_fill_brewer("layer3", palette = "Dark2", drop=FALSE, na.value = "transparent", na.translate=FALSE)

仍显示黑色图例的图像


恳请各位提供解决建议!

内容的提问来源于stack exchange,提问作者Michael Hallquist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:05:59