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

R语言Plotly散点图如何在图例中同时添加颜色条、标记大小与符号说明

R Plotly 散点图多维度映射多图例实现方案

你原有代码的核心问题是Plotly单个trace默认仅自动渲染连续颜色的色条图例,分类符号、连续大小的图例需要通过拆分轨迹、添加虚拟不可见轨迹的方式手动实现,同时你原有代码存在两处笔误:colorbar和坐标轴参数的titel拼写错误(应为title)、悬浮文本重复写了两次Item_2,修正及实现多图例的完整代码如下:

library(plotly)
# 原始数据
test_Xn <- c(13, 7, 12, -7, -9, 8)
test_Yn <- c(3, -0.5, 6, 3, 11, 5)
test_data <- data.frame("Item_1"= c(2.6, 2.6, 1.6, 3.2, NA, 1.8), 
                        "Item_2"= c(2.7, 1.8, 2.2, 2.8, 3.2, 2), 
                        "Item_3"= c(1, 2, 1, 2, 1, 1))
# 1. 初始化画布,按Item_3分组拆分轨迹,自动生成符号图例
test <- plot_ly() %>%
  # 分组添加实际数据点
  add_trace(data = test_data,
            x = ~test_Xn, y = ~test_Yn,
            type = "scatter", mode = "markers",
            # 悬浮文本
            text = ~paste("<b>Item_1: </b>", Item_1,
                          "<br><b>Item_2: </b>", Item_2,
                          "<br><b>Item_3: </b>", Item_3),
            hoverinfo = "text",
            # 符号映射Item_3
            symbol = ~as.factor(Item_3),
            symbols = c("circle", "square"), # 自定义1、2对应的符号
            legendgroup = "Item_3",
            name = ~as.factor(Item_3),
            # 颜色映射Item_1
            marker = list(sizemode = "diameter",
                          color = ~Item_1,
                          cmin = 1, cmax = 6,
                          colorbar = list(title = "Item_1",
                                          x = 1.1, # 调整色条位置避免重叠
                                          xanchor = "left",
                                          yanchor = "middle"),
                          colorscale = "Viridis",
                          # 大小映射Item_2
                          size = ~Item_2*25)) %>%
  # 2. 添加不可见虚拟点生成大小图例
  add_trace(x = rep(-20, 3), y = rep(-20, 3), # 坐标放在画布显示范围外
            type = "scatter", mode = "markers",
            showlegend = T,
            legendgroup = "Item_2",
            name = c("1", "2.5", "4"), # 对应Item_2的刻度值
            marker = list(sizemode = "diameter",
                          color = "gray", # 统一颜色避免干扰
                          size = c(1*25, 2.5*25, 4*25), # 和实际缩放比例一致
                          opacity = 1))
# 坐标轴配置,修正titel为title
test_axis <- list(title="", 
                  showgrid=T, 
                  showticklabels=T, 
                  zeroline=F,
                  range = c(-12, 15)) # 固定坐标范围,避免虚拟点被显示
# 布局配置,调整图例位置
test_plot <- layout(test, 
                    xaxis = test_axis, 
                    yaxis = test_axis,
                    legend = list(x = 1.2, y = 0.5, title = list(text = "<b>Legend</b>")))
print(test_plot)

关键实现说明

  • 符号图例:将原数据按Item_3分组为不同trace,Plotly会自动为分类变量生成符号对应的图例,通过legendgroup将同维度的图例归为一组
  • 大小图例:添加3个坐标在画布可视范围外的虚拟标记点,大小和你设置的Item_2*25缩放规则完全匹配,仅显示在图例中不会干扰实际散点
  • 位置调整:通过x参数分别调整色条、普通图例的位置,避免三者重叠影响可读性

运行上述代码后即可同时得到:Item1对应的连续色条、Item2对应的大小比例图例、Item3对应的符号对应图例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:36:04