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

