如何根据输入参数动态为Highcharts添加系列?
动态生成Highcharts柱状图系列(基于输入参数n)
问题描述
需要创建一个Highcharts柱状图,系列数量由输入参数n(整数)决定,展示data.table(代码中名为data)中的前n个值。当前代码是静态固定5个系列,尝试用for循环实现动态添加但未成功。
原代码:
n <- input$Top_n # Date Range Selected: d1 <- as.Date(input$DateRange[1], "%Y-%mm-%dd") d2 <- as.Date(input$DateRange[2], "%Y-%mm-%dd") # d1 <- as.Date("2021-01-01") # d2 <- as.Date(today()) # Data Table: data <- data.table(pl_all) %>% filter(GRUPO %in% input$PickerGrupos) # data <- data.table(pl_all) %>% # filter(GRUPO %in% list('Domesticos','VP')) data <- data[DATA >= d1 & DATA <= d2] data<- data %>% group_by(FUNDO) %>% summarise(IN = sum(SUBSCRICOES), OUT = sum(RESGATES), NET = sum(NET))%>% arrange(desc(NET)) %>% slice(1:n) # Bar Plot: highchart() %>% hc_chart(type= "column") %>% hc_xAxis(categories= list("TOP 5")) %>% hc_add_series(name= data$FUNDO[1], data = data$NET[1], color= "#336600") %>% hc_add_series(name= data$FUNDO[2], data = data$NET[2], color="#990000") %>% hc_add_series(name= data$FUNDO[3], data = data$NET[3], color = "#006666") %>% hc_add_series(name= data$FUNDO[4], data = data$NET[4]) %>% hc_add_series(name= data$FUNDO[5], data = data$NET[5]) %>% hc_exporting(enabled = TRUE)
尝试的for循环代码:
for(i in 1:n){ hc<- hc_add_series(hc,name= data$FUNDO[i], data = data$NET[i], color= "#336600") }
测试数据:
structure(list(FUNDO = 1:52, IN = c(832027943.4, 477550794.84, 323069484.57, 185214318.25, 316335887.74, 142476573.92, 67630816.77, 63115006.06, 44740413.27, 32909661.29, 33073221.78, 34939968.39, 25546990.24, 22669240.51, 19500000, 23030106.11, 21316486.18, 18924841.18, 29676794.83, 13499838.72, 11824163.88, 13228857.01, 13556784.21, 11537128.91, 47785529.13, 19803066.97, 17909773.41, 8034675.36, 6558370, 3755270.85, 2766415.2, 3718513.49, 3807326.99, 1819550, 1242564.71, 3185709.61, 296241.74, 2109856.31, 1076167.9, 5130848.18, 2364004.75, 1645003.19, 21700009.95, 1236552.92, 900418.92, 3357288.09, 1944435.19, 742440.97, 244401865.68, 37930356.35, 56376893.94, 108916868.79001), OUT = c(531264608.2, 204190266.1, 79243317.98, 15545143.94, 189727969.14, 36911398, 0, 19613186.16, 2272148.59, 804610.68, 2256049.18, 8986464.83, 2161334.36, 1474564.76, 31835.87, 4414243.98, 3465787.42, 2195498.38, 13703006.83, 202749.14, 80976.65, 1756626.79, 2105973.06, 261445.87, 36804651.89, 9624599.38, 8206163.67, 606446.01, 502310.75, 479033.95, 816610.17, 2184654.08, 2404520.72, 429681.76, 39171.3, 2882738.83, 747770.06, 2587886.52, 1670996.38, 7128933.38, 4445475.12, 3841877.14, 24094717.08, 4305708.18, 6865107.54, 9803609.04, 9665802.15, 14326918.86, 274946605.12, 78086552.87, 261541233.54, 350964756.25), NET = c(300763335.2, 273360528.74, 243826166.59, 169669174.31, 126607918.6, 105565175.92, 67630816.77, 43501819.9, 42468264.68, 32105050.61, 30817172.6, 25953503.56, 23385655.88, 21194675.75, 19468164.13, 18615862.13, 17850698.76, 16729342.8, 15973788, 13297089.58, 11743187.23, 11472230.22, 11450811.15, 11275683.04, 10980877.24, 10178467.59, 9703609.74, 7428229.35, 6056059.25, 3276236.9, 1949805.03, 1533859.41, 1402806.27, 1389868.24, 1203393.41, 302970.78, -451528.32, -478030.21, -594828.48, -1998085.2, -2081470.37, -2196873.95, -2394707.13, -3069155.26, -5964688.62, -6446320.95, -7721366.96, -13584477.89, -30544739.44, -40156196.52, -205164339.6, -242047887.45999)), row.names = c(NA, -52L), class = c("tbl_df", "tbl", "data.frame"))
解决方案
你的for循环问题在于没有先初始化hc对象,每次循环重新赋值会覆盖之前的结果,导致最终只有最后一个系列被添加。另外可以优化x轴的分类文本,使其随n动态变化,同时可以设置动态颜色或者使用Highcharts默认配色。
方法1:修正for循环实现
# 初始化图表基础配置 hc <- highchart() %>% hc_chart(type = "column") %>% hc_xAxis(categories = paste0("TOP ", n)) %>% hc_exporting(enabled = TRUE) # 动态添加n个系列 for(i in 1:n){ # 可选:保留前3个系列的自定义颜色,后续用默认色 color <- if(i <=3) c("#336600", "#990000", "#006666")[i] else NULL hc <- hc_add_series( hc, name = as.character(data$FUNDO[i]), data = data$NET[i], color = color ) } hc # 输出最终图表
方法2:使用lapply+管道(tidyverse风格)
如果习惯用管道操作,可以用purrr包的reduce函数累积添加系列:
library(purrr) highchart() %>% hc_chart(type = "column") %>% hc_xAxis(categories = paste0("TOP ", n)) %>% hc_exporting(enabled = TRUE) %>% # 遍历前n行数据,动态添加系列 reduce(1:n, .init = ., function(hc, i){ color <- if(i <=3) c("#336600", "#990000", "#006666")[i] else NULL hc_add_series( hc, name = as.character(data$FUNDO[i]), data = data$NET[i], color = color ) })
关键修正点
- 初始化
hc对象:必须先创建基础图表框架,再在循环中逐步叠加系列,避免覆盖。 - 动态x轴文本:将固定的"TOP 5"改为
paste0("TOP ", n),匹配当前选择的数量。 - 颜色兼容:保留你原来前3个系列的自定义颜色,后续系列自动使用Highcharts默认配色,也可以扩展自定义颜色向量实现全系列统一配色。
内容的提问来源于stack exchange,提问作者Caetano Almeida e Brito
相关产品推荐
相关产品推荐

