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

基于R语言data.table创建自定义堆叠条形图(含颜色、图例、悬停)

问题描述

给定如下R语言data.table数据结构:

dt.data <- structure(list(yyyymm= c("2024-04", "2024-04", "2024-04", 
"2024-04", "2024-04", "2024-04", "2024-04", "2024-04", "2024-04", 
"2024-04", "2024-04", "2024-04", "2024-04", "2024-04", "2024-05", 
"2024-05", "2024-05", "2024-05", "2024-05", "2024-05", "2024-05", 
"2024-05", "2024-05", "2024-05", "2024-05", "2024-05", "2024-05", 
"2024-05", "2024-06", "2024-06", "2024-06", "2024-06", "2024-06", 
"2024-06", "2024-06", "2024-06", "2024-06", "2024-06", "2024-06", 
"2024-06", "2024-06", "2024-06", "2024-07", "2024-07", "2024-07", 
"2024-07", "2024-07", "2024-07", "2024-07", "2024-07"), value = c(0, 
-23760, 720, 720, -13680, 18252, -2160, 3600, 6552, -1420.56, 
20534.4, 2160, 5040, 1980, 0, -24552, 744, 744, -4464, 18860.4, 
-2232, 3720, 10490.4, -1467.91, 15266.88, 2232, 5208, 2046, 0, 
-23760, 720, 720, -720, 18252, -2160, 3600, 10152, -1420.56, 
11174.4, 2160, 5040, 1980, 0, -24552, 744, 744, -744, 18860.4, 
-2232, 3720), testComp = c("Axpo (CH)", "CEZ (CZ)", "EDF Trading (GB)", 
"Energie AG (AT)", "Energie Klagenfurt (AT)", "Engie (FR)", "HSE (SI)", 
"Mercuria (CH)", "OMV Gas M&T (AT)", "RAG (AT)", "RWE (DE)", 
"RWE (GB)", "SEFE (GB)", "WINGAS (DE)", "Axpo (CH)", "CEZ (CZ)", 
"EDF Trading (GB)", "Energie AG (AT)", "Energie Klagenfurt (AT)", 
"Engie (FR)", "HSE (SI)", "Mercuria (CH)", "OMV Gas M&T (AT)", 
"RAG (AT)", "RWE (DE)", "RWE (GB)", "SEFE (GB)", "WINGAS (DE)", 
"Axpo (CH)", "CEZ (CZ)", "EDF Trading (GB)", "Energie AG (AT)", 
"Energie Klagenfurt (AT)", "Engie (FR)", "HSE (SI)", "Mercuria (CH)", 
"OMV Gas M&T (AT)", "RAG (AT)", "RWE (DE)", "RWE (GB)", "SEFE (GB)", 
"WINGAS (DE)", "Axpo (CH)", "CEZ (CZ)", "EDF Trading (GB)", "Energie AG (AT)", 
"Energie Klagenfurt (AT)", "Engie (FR)", "HSE (SI)", "Mercuria (CH)"
)), row.names = c(NA, -50L), class = c("data.table", "data.frame"
))

需要创建堆叠条形图,满足以下要求:

  • X轴对应yyyymm字段
  • Y轴对应各testComp的value字段
  • 每个testComp使用不同颜色并显示图例
  • 支持自定义hover交互信息

方法1:使用ggplot2+ggiraph(静态转交互)

通过ggiraph扩展ggplot2的交互能力,实现自定义hover内容,同时保留ggplot2的绘图风格。

代码示例

# 加载依赖包
library(data.table)
library(ggplot2)
library(ggiraph)

# 创建交互式堆叠条形图
p <- ggplot(dt.data, aes(x = yyyymm, y = value, fill = testComp)) +
  # 替换geom_col为交互版本,自定义hover内容
  geom_col_interactive(
    aes(tooltip = paste0("公司: ", testComp, "\n月份: ", yyyymm, "\n数值: ", round(value, 2))),
    position = "stack"
  ) +
  # 自定义颜色方案,也可用scale_fill_manual手动指定每个公司的颜色
  scale_fill_brewer(palette = "Paired") +
  labs(x = "月份", y = "数值", fill = "公司") +
  theme_minimal()

# 渲染交互图表,可设置hover时的样式
ggiraph(code = print(p), hover_css = "fill:orange;stroke:black;")

方法2:使用plotly(原生交互式图表)

plotly原生支持多种hover模式,能更灵活地控制交互逻辑,适合需要复杂hover效果的场景。

代码示例

# 加载依赖包
library(data.table)
library(plotly)

# 创建交互式堆叠条形图
p <- plot_ly(dt.data, 
             x = ~yyyymm, 
             y = ~value, 
             color = ~testComp, 
             type = "bar",
             # 指定使用自定义文本作为hover信息
             hoverinfo = "text",
             text = ~paste0("公司: ", testComp, "\n月份: ", yyyymm, "\n数值: ", round(value, 2)),
             # 颜色方案,也可手动传入颜色向量如colors = c("#FF0000", "#00FF00", ...)
             colors = "Paired") %>%
  layout(
    barmode = "stack",
    xaxis = list(title = "月份"),
    yaxis = list(title = "数值"),
    # 自定义hover模式:鼠标悬停时展示同一月份下所有公司的数据
    hovermode = "x unified"
  )

# 显示图表
p

hovermode可选值说明:

  • "closest":仅显示鼠标最近的单一条形hover信息
  • "x":展示同一月份下所有条形的hover信息,分框显示
  • "x unified":将同一月份下所有条形的hover信息合并在一个框内展示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:03:14