使用hctreemap2生成树图的问题

Problems generating tree diagram with hctreemap2

library(highcharter)
library(dplyr)
library(viridisLite)
library(forecast)
library(treemap)

data("Groceries", package = "arules")
dfitems <- tbl_df(Groceries@itemInfo)

set.seed(10)

dfitemsg <- dfitems %>%
  mutate(category = gsub(" ", "-", level1),
         subcategory = gsub(" ", "-", level2)) %>%
  group_by(category, subcategory) %>% 
  summarise(sales = n() ^ 3 ) %>% 
  ungroup() %>% 
  sample_n(31)


hctreemap2(group_vars = c("category","subcategory"),
           size_var = "sales")%>% 
  hc_tooltip(pointFormat = "<b>{point.name}</b>:<br>
                            Pop: {point.value:,.0f}<br>
                            GNI: {point.colorValue:,.0f}")

错误如下

Error in hctreemap2(., group_vars = c("category", "subcategory"), size_var = "sales") : Treemap data uses same label at multiple levels.

我什么都试过了,还是不行,有经验的人能给我解释一下这是怎么回事吗?

当我尝试你的代码时,它还声明该函数已被弃用并使用 data_to_hierarchical。虽然,它从来没有那么简单,对吧?我尝试了多种方法让 hctreemap2 正常工作,但无法辨别该问题。从那里我转向推荐的包 data_to_hierarchical。现在这没有问题了——一旦我想出了正确的 type,事后看来这似乎很明显。

话虽如此,这就是我得到的:

data_to_hierarchical(data = dfitemsg,
                     group_vars = c(category,subcategory),
                     size_var = sales) %>% 
  hchart(type = "treemap") %>% 
  hc_tooltip(pointFormat = "<b>{point.name}</b>:<br>
                            Pop: {point.value:,.0f}<br>
                            GNI: {point.colorValue:,.0f}")

您实际上并没有指定颜色,所以 GNI 显示为空白。

如果您 运行 遇到任何问题,请告诉我。

根据您的评论:

我还没有找到将颜色更改为密度的方法,hctreemap2treemap 似乎都是这样做的。函数 data_to_heirarchical 将颜色编码为第一个分组变量或级别 1 变量。

无意间,我确实弄明白了为什么hctreemap2函数不起作用。它检查是否有任何类别标签与子类别标签相同。我没有查看所有数据,但我知道有一个 perfumery perfumery。我不明白那是什么硬停。如果这是此调用的问题,为什么 data_to_heirchical 不也查找此问题?

所以,我改变了功能。首先,我调用了函数本身。

x = hctreemap2

然后我从环境窗格中选择了它。或者,您可以编码 View(x).

此视图是只读的,但比控制台更易于阅读。我复制了该函数并将其分配给其原始名称并进行了更改。我删除了两段代码,这在结构上没有改变图表的创建方式。

我删除了函数中的第一行代码:

.Deprecated("data_to_hierarchical")

和这段代码(大约向下三分之一)

if (data %>% select(!!!group_syms) %>% map(unique) %>% unlist() %>% 
        anyDuplicated()) {
        stop("Treemap data uses same label at multiple levels.")
    }

这让我不得不用这段代码重新创建函数:

hctreemap2 <- function (data, group_vars, size_var, color_var = NULL, ...) 
{
  assertthat::assert_that(is.data.frame(data))
  assertthat::assert_that(is.character(group_vars))
  assertthat::assert_that(is.character(size_var))
  if (!is.null(color_var)) 
    assertthat::assert_that(is.character(color_var))
  group_syms <- rlang::syms(group_vars)
  size_sym <- rlang::sym(size_var)
  color_sym <- rlang::sym(ifelse(is.null(color_var), size_var, color_var))
  data <- data %>% mutate_at(group_vars, as.character)
  name_cell <- function(..., depth) paste0(list(...), 
                                           seq_len(depth), 
                                           collapse = "")
  data_at_depth <- function(depth) {
    data %>% 
      group_by(!!!group_syms) %>% 
      summarise(value = sum(!!size_sym), colorValue = sum(!!color_sym)) %>% 
      ungroup() %>% 
      mutate(name = !!group_syms[[depth]], level = depth) %>% 
      mutate_at(group_vars, as.character()) %>% {
        if (depth == 1) {
          mutate(., id = paste0(name, 1))
        }
        else {
          mutate(., 
                 parent = pmap_chr(list(!!!group_syms[seq_len(depth) - 1]), 
                                   name_cell, depth = depth - 1), 
                 id = paste0(parent, name, depth))
        }
      }
  }
  treemap_df <- seq_along(group_vars) %>% map(data_at_depth) %>% bind_rows()
  data_list <- treemap_df %>% highcharter::list_parse() %>% 
    purrr::map(~.[!is.na(.)])
  colorVals <- treemap_df %>% 
    filter(level == length(group_vars)) %>% pull(colorValue)
  highchart() %>% 
    hc_add_series(data = data_list, type = "treemap", 
                  allowDrillToNode = TRUE, ...) %>% 
    hc_colorAxis(min = min(colorVals), max = max(colorVals), enabled = TRUE)
}

现在您的代码可以正常运行了,就像最初编写的那样。您这样做并没有更改 highcharter 包。因此,如果您认为将来会使用它,请保存功能代码。您将需要库 purrr,因为您已经调用了 dplyr(大多数情况下,如果发生任何冲突),您可以只调用 tidyverse(一次调用多个库,包括dplyrpurrr).

这是 set.seed(10) 的样子:

如果向下钻取最大块:

我觉得这很奇怪,但我猜这就是您开始寻找的内容。