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
相关产品推荐
相关产品推荐

