如何消除ggnewscale图例中的额外点?并单独设置图例列数
解决方案:修复图例额外黑点并设置多列图例
针对你遇到的两个问题,我来一步步解决:
1. 移除图例中的额外黑色点
出现额外黑点的原因是两个颜色图层的图例符号发生了叠加:第一个geom_point(对应obj的大尺寸点)和第二个geom_point(对应time的常规尺寸点)的图例元素被错误地混合了。我们可以通过明确指定每个图例的符号样式来解决这个问题:
- 在第一个颜色刻度(
scale_color_manual)中,用guide_legend(override.aes = list(size=5))强制图例显示对应大尺寸的点; - 在第二个颜色刻度(
scale_color_viridis_d)中,同样用override.aes指定自己的符号大小,避免和第一个图例混淆。
2. 将"time"图例设置为2列
只需要在scale_color_viridis_d的参数中添加guide = guide_legend(ncol=2),就能让这个图例自动分成2列,而其他图例保持默认的单列布局。
修改后的完整代码
library(tidyverse) library(ggnewscale) set.seed(12345) brks = c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1) fd = expand.grid(x = seq(6,16, length.out = 100), y = seq(6,18, length.out = 100)) fd$z = sample(x = seq(0,1, length.out = 100), size = nrow(fd), replace = T) df.t = data.frame(s = LETTERS[1:5], l = c(11,12,8,15,14), d = c(13,10,7,16,8)) mypal = data.frame(A = "black", B = "red",C = "blue", D = "green", E = "yellow") summmmmmmm = expand.grid(s = LETTERS[1:5], yr = 1995:2012) summmmmmmm$yr = as.factor(summmmmmmm$yr) summmmmmmm$l = NA summmmmmmm$d = NA summmmmmmm[summmmmmmm$s == "A","l"] = rnorm(n = 18, mean = 11, sd = .5) summmmmmmm[summmmmmmm$s == "B","l"] = rnorm(n = 18, mean = 12, sd = .5) summmmmmmm[summmmmmmm$s == "C","l"] = rnorm(n = 18, mean = 8, sd = .5) summmmmmmm[summmmmmmm$s == "D","l"] = rnorm(n = 18, mean = 15, sd = .5) summmmmmmm[summmmmmmm$s == "E","l"] = rnorm(n = 18, mean = 14, sd = .5) summmmmmmm[summmmmmmm$s == "A","d"] = rnorm(n = 18, mean = 13, sd = .5) summmmmmmm[summmmmmmm$s == "B","d"] = rnorm(n = 18, mean = 10, sd = .5) summmmmmmm[summmmmmmm$s == "C","d"] = rnorm(n = 18, mean = 8, sd = .5) summmmmmmm[summmmmmmm$s == "D","d"] = rnorm(n = 18, mean = 16, sd = .5) summmmmmmm[summmmmmmm$s == "E","d"] = rnorm(n = 18, mean = 9, sd = .5) ggplot(data = fd, mapping = aes(x = x, y = y, z = z)) + geom_contour_filled(breaks = brks)+ geom_point(data = df.t, mapping = aes(x = l, y = d, color = s), inherit.aes = FALSE, size = 5) + scale_fill_manual(values = alpha(hcl.colors(100, "YlOrRd", rev = TRUE, alpha = 1), .99))+ # 修复obj图例符号,避免叠加黑点 scale_color_manual(values = alpha(mypal,1), name = "obj", guide = guide_legend(override.aes = list(size=5)))+ new_scale_color() + geom_point(data = summmmmmmm, mapping = aes(x = l, y = d, color = yr, group = s), shape = 19, inherit.aes = FALSE, show.legend = TRUE) + geom_path(data = summmmmmmm[order(summmmmmmm$yr),], mapping = aes(x = l, y = d, color = yr, group = as.factor(s)), inherit.aes = FALSE, show.legend = FALSE) + # 设置time图例为2列,并修复符号大小 scale_color_viridis_d(name = "time", guide = guide_legend(ncol=2, override.aes = list(size=3)))
关键修改说明
- 在
scale_color_manual中添加guide = guide_legend(override.aes = list(size=5)):确保obj图例显示的是和图层中一致的大尺寸点,不会被其他图层的符号干扰; - 在
scale_color_viridis_d中添加guide = guide_legend(ncol=2, override.aes = list(size=3)):既让time图例分成2列,也明确了它的符号大小,避免和第一个图例混淆。
这样修改后,你就能得到没有额外黑点的图例,同时time图例会以2列的形式展示。
内容的提问来源于stack exchange,提问作者M. Beausoleil
相关产品推荐
相关产品推荐

