R语言Plotly绘制Treemap树形图仅为最低层子节点按首数字配色咨询
实现方案
我们可以通过先识别最低层级叶子节点、再对叶子节点按标签首数字做颜色映射的方式实现需求,非叶子节点会自动沿用原treemapcolorway配置的配色,具体步骤如下:
步骤1:预处理数据集,新增标识和颜色映射列
library(plotly) library(stringr) # 识别最低层级叶子节点:没有出现在parent列中的节点即为没有子节点的最低层级节点 df$is_leaf <- !df$label %in% df$parent # 提取叶子节点标签开头的第一个数字 df$first_num <- ifelse(df$is_leaf, str_extract(df$label, "^\\d"), NA) # 自定义首数字对应的配色,可根据需求自行调整色值 color_map <- c( "1" = "#FFB3BA", "2" = "#BAFFC9", "3" = "#BAE1FF", "4" = "#FFFFBA", "5" = "#FFD6BA", "6" = "#E2BAFF", "7" = "#FFB3F2", "8" = "#B3FFF2", "9" = "#D0D0D0" ) # 生成最终颜色向量:非叶子节点设为NA,沿用原有treemapcolorway配色,叶子节点使用映射颜色 df$node_color <- color_map[df$first_num]
步骤2:修改绘图代码,新增颜色参数
注意原代码中treemapcolorway的第四个色值少了#符号,下述代码已补全避免报错:
fig <- plot_ly( type = "treemap", labels = df$label, parents = df$parent, values = df$value / 1000, branchvalues = "total", texttemplate = "%{label}: %{value:.1f} TWh", textinfo = "label+value+percent parent+percent", # 新增节点颜色配置 marker = list( colors = df$node_color ) ) %>% layout(treemapcolorway = c("#FF0000", "#00A79F", "#413D3A", "#B51F1F", "#007480", "#CAC7C7")) fig
补充说明
- 如果需要调整不同首数字对应的配色,直接修改
color_map中的色值即可 - 若标签开头为两位及以上数字,只需将提取首数字的正则改为
^\\d+,即可匹配完整开头数字序列再做映射
内容的提问来源于stack exchange,提问作者Jonas Schnidrig
相关产品推荐
相关产品推荐

