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

ggplot2多层使用size映射时如何拆分生成多个独立图例

解决方法

你可以通过给两类元素的size映射创建独立标尺,再统一连线类图例的名称,即可实现预期的拆分效果,同时调整图例显示规则避免不同元素混显。

修改后的绘图代码如下:

library(tidyverse)
library(ggnewscale)

# df_links、df_points数据定义保持和你原有代码一致
ggplot() + 
  geom_curve(data = df_links,
             aes(x = x, y = y,
                 xend = x_end,
                 yend = y_end,
                 size = collabs,
                 alpha = collabs),
             curvature = 0.33) +
  # 给连线的size和alpha设置相同的图例名,保证合并为同一个图例
  scale_size_continuous(name = "collabs",
                        guide = guide_legend(order = 1)) +
  scale_alpha_continuous(name = "collabs",
                         guide = guide_legend(order = 1,
                                              # 连线图例不显示点
                                              override.aes = list(point_size = 0))) +
  # 新建size的独立标尺,给点的大小映射使用
  new_scale("size") +
  geom_point(data = df_points,
             aes(x = x,
                 y = y,
                 size = papers),
             colour = "red") +
  scale_size_continuous(name = "papers",
                        guide = guide_legend(order = 2,
                                             # 点图例不显示线、透明度设为不透明
                                             override.aes = list(linetype = 0, alpha = 1))) +
  coord_fixed(xlim = c(-150, 180), ylim = c(-55, 80)) +
  theme_void()

核心逻辑

  • ggnewscale包的new_scale()函数可以为同一个美学参数(此处为size)创建第二个独立映射标尺,从根源上拆分点和线的大小图例
  • 连线的size和alpha映射的图例名称完全一致,ggplot会自动将二者合并为同一个图例,同时展示线宽和透明度的对应关系
  • override.aes参数用于过滤图例上不需要显示的图形元素,避免不同geom的样式混出现在同一个图例中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:57:03