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

如何消除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:35:13