You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言Highcharter树状图:边框、提示框值及自定义颜色问题

Highcharter树状图(Treemap)问题修复方案

问题现象

问题截图1
问题截图2

针对使用Highcharter创建树状图时遇到的三个问题,以下是具体修复方案及完整代码:

问题1:仅二级(Level 2)显示边框

原代码的层级设置逻辑正确,只需确保levelIsConstant = FALSE,让层级样式规则生效。一级节点设置borderWidth = 0和透明边框,二级节点保留白色边框即可。

问题2:提示框(Tooltip)数值显示异常

核心原因是data_to_hierarchical函数会将Measure列转换为节点的value字段,而非保留原字段名。因此tooltip中必须使用{point.value}替代{point.Measure},同时根据数据单位调整格式化逻辑。

问题3:按Nome_Bloco分组自定义颜色不生效

原代码直接传入所有国家的颜色列表导致分配混乱。修复步骤:

  1. 提取每个Nome_Bloco对应的唯一颜色
  2. 为一级节点设置分组颜色
  3. 二级节点基于父节点颜色调整亮度,保持分组视觉一致性

完整修正代码

generate_treemap_country <- function(data, measure, year_filter, isic_filter, threshold = 0.1) {
  measure_column <- ifelse(measure == "value", "US_FOB", "Peso_Liquido")
  
  # 过滤并汇总数据
  treemap_data <- data %>%
    filter((Ano == year_filter | year_filter == "Todos") & 
           (Nome_ISIC_Secao == isic_filter | isic_filter == "Todos")) %>%
    group_by(Nome_Bloco, Nome_Pais, Cor) %>%
    summarise(Measure = sum(.data[[measure_column]], na.rm = TRUE), .groups = "drop")
  
  # 应用阈值并处理"Outros"分组
  treemap_data <- treemap_data %>%
    mutate(Percent = Measure / sum(Measure) * 100) %>%
    mutate(Nome_Pais = ifelse(Percent < threshold, "Outros", Nome_Pais)) %>%
    group_by(Nome_Bloco, Nome_Pais, Cor) %>%
    summarise(Measure = sum(Measure), .groups = "drop")
  
  # 提取每个区域对应的唯一颜色
  bloco_colors <- treemap_data %>%
    distinct(Nome_Bloco, Cor) %>%
    tibble::deframe()
  
  # 层级样式设置:仅Level 2显示边框
  lvl_opts <- list(
    list(
      level = 1, 
      borderWidth = 0, 
      borderColor = "transparent", 
      dataLabels = list(
        enabled = TRUE, 
        format = "{point.name}", 
        style = list(color = "white", fontSize = "12px")
      ),
      # 为Level 1节点设置自定义颜色
      color = JS(function() {
        paste0("['", paste(bloco_colors, collapse = "', '"), "']")
      })
    ),
    list(
      level = 2, 
      borderWidth = 1, 
      borderColor = "white", 
      # 子节点基于父节点颜色调整亮度
      colorVariation = list(key = "brightness", to = 0.5)
    )
  )
  
  # 提示框格式化:使用转换后的value字段,并调整单位显示
  tooltip_text <- ifelse(
    measure == "value",
    # 若US_FOB单位为千美元,转换为百万美元显示
    "<b>{point.name}</b> <br> <b>Valor Exportado</b>: US$ {point.value/1000,.1f} mi",
    "<b>{point.name}</b> <br> <b>Peso Exportado</b>: {point.value:,.1f} toneladas"
  )
  
  # 创建层级数据
  hierarchical_data <- data_to_hierarchical(
    treemap_data, 
    c("Nome_Bloco", "Nome_Pais"), 
    "Measure"
  )
  
  # 生成树状图
  highchart() %>%
    hc_chart(type = "treemap", layoutAlgorithm = 'squarified', backgroundColor = "#fff") %>%
    hc_add_series(
      name = "Measure", 
      type = "treemap", 
      allowTraversingTree = TRUE, 
      levelIsConstant = FALSE,
      data = hierarchical_data,
      allowDrillToNode = TRUE, 
      levels = lvl_opts
    ) %>%
    hc_tooltip(useHTML = TRUE, pointFormat = tooltip_text) %>%
    hc_exporting(enabled = TRUE)
}

# 使用示例数据运行函数
generate_treemap_country(amostra_exemplo, "value", 2020, "Agropecuária")

关键修正点说明

  • 边框控制:一级节点完全隐藏边框,二级节点显示白色细边框,满足仅二级显示边框的需求。
  • 提示框修复:替换字段名并调整单位转换,确保数值正确显示。
  • 颜色分组:通过提取区域唯一颜色并绑定到一级节点,二级节点继承父色并调整亮度,实现分组颜色统一。

内容的提问来源于stack exchange,提问作者Radupi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:43:09