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

如何用echarts4r绘制类似ggplot position=dodge的分组并列柱状图?

用echarts4r动态绘制分组并列柱状图(类似ggplot的position=dodge效果)

问题描述

核心疑问

是否可以使用echarts4r绘制分组并列柱状图,实现类似ggplot中position=dodge的效果?

详细需求

需要在交互式Shiny应用中,用echarts4r绘制多变量分组的并列柱状图,示例数据如下:

library(tibble)
data <- tibble(
  Year = c(rep(c(rep("2021", 2), rep("2022", 2)), 3)),
  Month = c(rep("3", 4), rep("10", 4), rep("12", 4)),
  Vehicle = rep(c("car", "bus", "tram"), 4),
  N = runif(12, min=30, max=100)
)

具体需求:X轴为Vehicle,Y轴为N,每个Vehicle分类下,按Month和Year组合的分组绘制对应N的并列柱状图。

现有实现的局限

已通过静态方式实现效果:

library(dplyr)
library(tidyr)
library(echarts4r)

data <- data |> unite(Period, Month, Year, sep = "/") |> group_by(Period)

data %>% 
  pivot_wider(names_from = Period, values_from = N) %>% 
  e_charts(Vehicle) %>% 
  e_bar(`3/2021`) %>%
  e_bar(`10/2021`) %>%
  e_bar(`12/2021`) %>%
  e_bar(`3/2022`) %>% 
  e_bar(`10/2022`) %>% 
  e_bar(`12/2022`) 

但由于Shiny应用中用户可自由选择年月,Period列的取值和数量不固定,无法手动逐个调用e_bar,需要动态实现方案。

期望能像堆叠柱状图那样简洁写法:

data <- data |> unite(Period, Month, Year, sep = "/") |> group_by(Period)
data |> e_charts(Vehicle, stack = "grp") |> e_bar(N)

但需将堆叠改为并列显示。

解决方案

可以利用echarts4r的分组特性结合迭代逻辑,动态生成并列柱状图,无需手动逐个调用e_bar。以下是两种简洁的实现方案:

方案一:基于长格式数据分组迭代

直接对合并后的长格式数据分组,用e_map自动生成每个分组的柱状图系列:

library(tibble)
library(dplyr)
library(tidyr)
library(echarts4r)

set.seed(123) # 设置随机种子保证结果可复现
data <- tibble(
  Year = c(rep(c(rep("2021", 2), rep("2022", 2)), 3)),
  Month = c(rep("3", 4), rep("10", 4), rep("12", 4)),
  Vehicle = rep(c("car", "bus", "tram"), 4),
  N = runif(12, min=30, max=100)
)

data |> 
  unite(Period, Month, Year, sep = "/") |> 
  group_by(Period) |> 
  e_charts(Vehicle) |> 
  # 按分组动态生成并列柱状图
  e_map(N, .f = e_bar, name = Period) |> 
  e_grid(containLabel = TRUE) |> 
  e_x_axis(type = "category") |> 
  e_y_axis(name = "N") |> 
  e_tooltip(trigger = "axis") |> 
  e_legend()

方案二:基于宽格式数据遍历列

将数据转为宽格式后,遍历所有Period列动态添加柱状图系列:

library(tibble)
library(dplyr)
library(tidyr)
library(echarts4r)
library(purrr)

set.seed(123)
data <- tibble(
  Year = c(rep(c(rep("2021", 2), rep("2022", 2)), 3)),
  Month = c(rep("3", 4), rep("10", 4), rep("12", 4)),
  Vehicle = rep(c("car", "bus", "tram"), 4),
  N = runif(12, min=30, max=100)
)

data_wide <- data |> 
  unite(Period, Month, Year, sep = "/") |> 
  pivot_wider(names_from = Period, values_from = N)

data_wide |> 
  e_charts(Vehicle) |> 
  # 遍历所有Period列生成柱状图
  walk(~ e_bar(., name = .x)) |> 
  e_grid(containLabel = TRUE) |> 
  e_x_axis(type = "category") |> 
  e_y_axis(name = "N") |> 
  e_tooltip(trigger = "axis") |> 
  e_legend()

关键说明

  • e_map是echarts4r的分组迭代函数,会自动按group_by的分组(这里是Period)生成对应柱状图系列,天然实现并列效果;
  • e_tooltip(trigger = "axis")可让鼠标悬停时显示同一X轴位置下所有并列柱子的数据,优化交互体验;
  • 若需调整柱子间距,可在e_bar中添加barGap参数,比如e_bar(N, barGap = "10%"),控制同组内柱子的间距。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:12:21