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

