如何为highcharter柱状图设置条件颜色与填充图案?
解决方案
要实现最后一列(2020年)图案填充、其余列纯色的堆叠柱状图,需要从数据格式调整和图案填充模块正确配置两方面入手,以下是修正后的完整代码:
library(tidyverse) library(highcharter) set.seed(123) # 设置随机种子保证结果可复现 df <- data.frame( year = seq(2001, 2020, by=1), newA = sample(1:15, size=20, replace=T), newB = sample(1:15, size=20, replace=T) ) # 处理New A系列数据:前19个点纯色,最后1个点图案填充 data_newA <- map2(df$newA, df$year, function(y, yr) { if (yr != 2020) { list(y = y, color = "#2f7ed8") # 自定义纯色 } else { list( y = y, color = list( pattern = list( path = "M 0 0 L 10 10 M 9 -1 L 11 1 M -1 9 L 1 11", width = 10, height = 10, color = "#2f7ed8" # 图案线条颜色与纯色一致 ) ) ) } }) # 处理New B系列数据:同理设置样式 data_newB <- map2(df$newB, df$year, function(y, yr) { if (yr != 2020) { list(y = y, color = "#0d233a") # 自定义纯色 } else { list( y = y, color = list( pattern = list( path = "M 0 5 L 5 0 L 10 5 L 5 10 Z", width = 10, height = 10, color = "#0d233a" ) ) ) } }) highchart() %>% hc_chart(type = "column") %>% hc_add_dependency("modules/pattern-fill.js") %>% # 必须加载图案填充模块 hc_add_series( name = "New A", data = data_newA, stack = "new", showInLegend = F ) %>% hc_add_series( name = "New B", data = data_newB, stack = "new", showInLegend = F ) %>% hc_plotOptions(column = list(stacking = "normal")) %>% hc_xAxis(categories = df$year, title = list(text = ""))
关键说明:
数据格式转换:
不再直接传递数值向量,而是将每个数据点封装为包含y(数值)和color(样式)的列表,这样才能单独控制最后一个点的填充方式。图案填充配置:
- 必须通过
hc_add_dependency("modules/pattern-fill.js")加载模块,否则图案属性会被忽略。 - 图案的
path参数用SVG路径定义形状:- 第一个图案是交叉线(
M 0 0 L 10 10 M 9 -1 L 11 1 M -1 9 L 1 11) - 第二个图案是菱形(
M 0 5 L 5 0 L 10 5 L 5 10 Z)
- 第一个图案是交叉线(
- 可调整
width/height控制图案密度,color设置图案线条颜色与纯色保持一致,视觉更统一。
- 必须通过
自定义纯色:
普通数据点通过color = "#xxxxxx"直接设置自定义纯色,替代默认配色。
内容的提问来源于stack exchange,提问作者DanB
相关产品推荐
相关产品推荐

