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

ggplot2中修改scale_size_continuous()图例符号样式的技术问题

解决ggplot2中尺寸图例样式修改及双图例保留问题

问题描述

需要在ggplot2绘图中,将scale_size_continuous()对应的图例符号改为无填充的黑色边框三角形,同时保留「类别(category)」和「尺寸(per)」两个独立图例,但现有代码无法实现该效果。

示例数据

data <- structure(list(date = structure(c(1431388800, 1444780800, 1456876800, 1469145600, 1469664000, 1425081600, 1445299200, 1488758400, 1524960000, 1454544000, 1540512000, 1429228800, 1481587200, 1526688000, 1445904000, 1498348800, 1464825600, 1451174400, 1450310400, 1539216000, 1528934400, 1525996800, 1465084800, 1531180800), class = c("POSIXct", "POSIXt"), tzone = "UTC"), cnt1 = c(76, 140, 99, 10, 123, 124, 160, 58, 47, 43, 86, 112, 26, 123, 111, 49, 65, 93, 174, 49, 5, 16, 84, 4), cnt2 = c(111, 200, 550, 73, 123, 184, 166, 131, 189, 136, 250, 195, 26, 154, 125, 100, 168, 151, 255, 49, 200, 144, 177, 4), per = c(68.4684684684685, 70, 18, 13.6986301369863, 100, 67.3913043478261, 96.3855421686747, 44.2748091603053, 24.8677248677249, 31.6176470588235, 34.4, 57.4358974358974, 100, 79.8701298701299, 88.8, 49, 38.6904761904762, 61.5894039735099, 68.2352941176471, 100, 2.5, 11.1111111111111, 47.4576271186441, 100), status = c("A", "B", "C", "C", "B", "B", "B", "A", "A", "A", "C", "C", "C", "A", "B", "C", "B", "C", "A", "A", "A", "B", "B", "B"), category = c("CAT3", "CAT1", "CAT3", "CAT2", "CAT1", "CAT1", "CAT1", "CAT3", "CAT2", "CAT3", "CAT2", "CAT1", "CAT1", "CAT1", "CAT2", "CAT2", "CAT1", "CAT1", "CAT1", "CAT1", "CAT3", "CAT3", "CAT3", "CAT1")), .Names = c("date", "cnt1", "cnt2", "per", "status", "category"), row.names = c(NA, -24L), class = c("tbl_df", "tbl", "data.frame"))

目标图例样式

  • 尺寸图例:使用统一的无填充黑色边框三角形,按数值大小区分符号尺寸
  • 类别图例:保留不同填充色的三角形样式
  • 两个图例独立显示,无合并或样式混乱

当前绘图代码

ggplot(data, aes(x=date, y=cnt2)) + 
      scale_y_log10(breaks=c(1,10,100,1000,5000)) +
      geom_point(aes(fill=category,col=category, size=per, shape=category), alpha=0.7)+
      scale_color_manual(name = "",values=c("CAT1"="black","CAT2"="black","CAT3"="black")) + 
      scale_shape_manual(name = "",values=c('CAT1'=24, 'CAT2'=25, 'CAT3'=23))+
      scale_fill_manual(name = "",values=c("CAT1"="blue","CAT2"="red","CAT3"="green"))+
      scale_size_continuous(trans="sqrt",range = c(1, 5),breaks=c(5,10,25,50,75,100)) 

解决方案

核心是通过guides()函数单独覆盖尺寸图例的样式属性,强制其使用无填充黑边三角形,同时确保类别图例保留原有样式:

ggplot(data, aes(x=date, y=cnt2)) + 
  scale_y_log10(breaks=c(1,10,100,1000,5000)) +
  geom_point(aes(fill=category, col=category, size=per, shape=category), alpha=0.7)+
  scale_color_manual(name = "类别", values=c("CAT1"="black","CAT2"="black","CAT3"="black")) + 
  scale_shape_manual(name = "类别", values=c('CAT1'=24, 'CAT2'=25, 'CAT3'=23))+
  scale_fill_manual(name = "类别", values=c("CAT1"="blue","CAT2"="red","CAT3"="green"))+
  scale_size_continuous(trans="sqrt", range = c(1, 5), breaks=c(5,10,25,50,75,100), title = "百分比") +
  # 单独设置尺寸图例的符号样式
  guides(
    size = guide_legend(
      override.aes = list(
        shape = 24,  # 选择无填充边框的三角形(24为上三角,25为下三角,23为倒三角,按需选择)
        fill = NA,   # 取消填充色
        color = "black",  # 设置边框为黑色
        alpha = 1    # 取消透明度,让边框显示更清晰
      )
    )
  ) +
  # 可选:调整图例位置,避免重叠
  theme(legend.position = "right")

关键说明

  1. override.aes参数可以强制修改图例的符号属性,不受图层映射的影响,这里专门为尺寸图例设置无填充黑边样式
  2. 将类别相关的color、fill、shape图例统一设置相同标题,确保它们合并为一个类别图例,尺寸图例则独立存在
  3. 取消尺寸图例的alpha,避免边框因透明度显示模糊

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:40:20