如何在Highcharts柱状图中按类型分组相同因子并按年份区分颜色
如何在Highcharts柱状图中按类型分组相同因子并按年份区分颜色
看起来你想要实现的是同一类型(low/medium/high)的柱子按年份聚集在一起,并且用不同颜色区分不同年份,同时用图例展示年份对应的颜色。你的代码目前存在的问题是把所有数据都塞进了一个系列里,而且x轴直接使用了重复的Type值,这就导致柱子没法正确分组,也没法按年份区分颜色。
问题核心分析
- 你当前的
hc_add_series只添加了一个系列,所有柱子都是绿色,完全没法区分不同年份的数据 - x轴用
test$Type会重复显示low/medium/high(因为每个年份都有这三个类型),所以看起来混乱,没有形成预期的分组效果 - 之前用
dplyr分组后没有做后续的系列转换处理,所以分组的作用没体现出来
解决方案
我们需要把数据按年份拆分成不同的系列,每个年份对应一个系列,这样Highcharts会自动把同一Type下的不同年份柱子放在一起,同时用不同颜色区分年份。具体实现如下:
# 加载所需包 library(dplyr) library(tidyr) library(highcharter) # 创建原始数据(保留你原来的代码) year <- 2020 low <- 45 medium <- 52 high <- 98 df <- data.frame(year, low, medium, high) year <- 2021 low <- 60 medium <- 83 high <- 80 df2 <- data.frame(year, low, medium, high) year <- 2022 low <- 64 medium <- 34 high <- 20 df3 <- data.frame(year, low, medium, high) year <- 2023 low <- 62 medium <- 47 high <- 58 df4 <- data.frame(year, low, medium, high) test <- rbind(df, df2, df3, df4) test <- test %>% pivot_longer(!year, names_to="Type", values_to = "total") # 整理成Highcharts需要的系列列表:每个年份对应一个系列 series_list <- test %>% group_by(year) %>% group_map(function(data, key) { list( name = as.character(key$year), data = data$total ) }) # 绘制最终图表 highchart() %>% hc_chart(type = "column") %>% # 批量添加所有年份的系列 hc_add_series_list(series_list) %>% # 设置x轴为唯一的Type值,作为分组依据 hc_xAxis(categories = unique(test$Type), title = list(text = "Type")) %>% hc_yAxis(title = list(text = "GWh")) %>% hc_title(text= "Types Year Comparison") %>% hc_subtitle(text= "test") %>% hc_caption(text= "Based on year 2007 population") %>% # 启用图例,显示年份对应的颜色 hc_legend(enabled= TRUE) %>% # 可选:调整柱子间距,让同一Type的分组更紧凑 hc_plotOptions(column = list( grouping = TRUE, groupPadding = 0.1, pointPadding = 0.05 ))
关键修改说明
series_list:用group_by(year)和group_map把每个年份的数据转换成独立的系列对象,每个系列包含年份名称和对应三个Type的数值hc_add_series_list:一次性添加所有年份的系列,Highcharts会自动将同一Type下的不同年份柱子归为一组unique(test$Type):x轴只显示一次low/medium/high,每个类别下会展示对应所有年份的柱子- 启用图例后,每个年份的颜色会在图例中清晰展示,方便用户区分不同年份的数据
备注:内容来源于stack exchange,提问作者Magnetar
相关产品推荐
相关产品推荐

