Plotly R中为堆叠条形图文本标签设置自定义字体颜色问题
Plotly R堆叠条形图文本标签颜色自定义问题解决
问题描述
基于指定示例数据,需要为Plotly R堆叠条形图实现:深色填充的条形搭配白色文本标签,浅色填充的条形搭配黑色文本标签。遇到两个问题:
- 使用命名向量设置标签颜色时,4月、5月的标签颜色不符合预期
- 将标签颜色关联到数据后,Var 3的标签在3月、6月错误显示为黑色(应为白色)
解决方案
核心是确保每个子图仅保留当前月份的有效数据(移除值为0的行),让Plotly能正确匹配分类与对应颜色。
完整代码
library(dplyr) library(tibble) library(plotly) # 原始数据 df <- structure(list(dsc_cat1 = c("Cat1", "Cat1", "Cat2", "Cat1", "Cat1", "Cat2", "Cat2", "Cat1", "Cat1", "Cat2", "Cat2", "Cat1", "Cat1", "Cat2", "Cat2", "Cat1", "Cat1", "Cat2", "Cat1", "Cat1", "Cat2", "Cat2"), dsc_cat3 = c("Var 1", "Var 2", "Var 3", "Var 1", "Var 2", "Var 3", "Var 4", "Var 1", "Var 2", "Var 3", "Var 4", "Var 1", "Var 2", "Var 5", "Var 3", "Var 1", "Var 2", "Var 3", "Var 1", "Var 2", "Var 3", "Var 4"), val = c(6200.63, 5358.48, 2417.35, 8022.49, 14852.6, 2417.35, 100.93, 5389.56, 14631.52, 2417.35, 84.39, 5387.66, 18231.84, 632.72, 1325.05, 5387.03, 14852.6, 2417.35, 5377.88, 14087.98, 1510.02, 47.27), mth = c(1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6)), row.names = c(NA, -22L), class = c("tbl_df", "tbl", "data.frame")) # 定义填充色与标签色的命名向量 fill_colours <- setNames( object = c("#304996", "#515575", "#915f78", "#cd6873", "#e88c7d"), nm = paste("Var", 1:5) ) label_colours <- setNames( object = c("white", "white", "white", "black", "black"), nm = paste("Var", 1:5) ) # 将标签颜色合并到原始数据 df <- df %>% left_join(enframe(label_colours), by = c("dsc_cat3" = "name")) %>% rename(label_colour = value) # 生成子图并组合 subplot( lapply(unique(df$mth), function(m) { # 仅保留当前月份的有效数据,移除val=0的行 data <- df %>% filter(mth == m) %>% arrange(dsc_cat1) x_title <- paste("Month", m) show_legend <- m == 1 plot_ly(data = data, x = ~dsc_cat1, y = ~val, type = "bar", legendgroup = ~dsc_cat3, text = ~val, textfont = list(size = 12, color = ~label_colour), textposition = "auto", color = ~dsc_cat3, colors = fill_colours, showlegend = show_legend ) %>% layout(xaxis = list(title = x_title)) }), titleX = TRUE, shareY = TRUE) %>% layout(barmode = 'stack', showlegend = TRUE)
关键调整说明
- 数据过滤:将
mutate(val = ifelse(...))替换为filter(mth == m),确保每个子图只包含当前月份的有效数据,避免无效行干扰颜色匹配 - 颜色绑定:直接在
textfont中使用~label_colour,让Plotly精准匹配每个分类的文本颜色 - 分类一致性:填充色仍使用命名向量
fill_colours,保证所有子图的分类填充色统一
内容的提问来源于stack exchange,提问作者sactyr
相关产品推荐
相关产品推荐

