使用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 显示为空白。
如果您 运行 遇到任何问题,请告诉我。
根据您的评论:
我还没有找到将颜色更改为密度的方法,hctreemap2
和 treemap
似乎都是这样做的。函数 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
(一次调用多个库,包括dplyr
和 purrr
).
这是 set.seed(10)
的样子:
如果向下钻取最大块:
我觉得这很奇怪,但我猜这就是您开始寻找的内容。
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 显示为空白。
如果您 运行 遇到任何问题,请告诉我。
根据您的评论:
我还没有找到将颜色更改为密度的方法,hctreemap2
和 treemap
似乎都是这样做的。函数 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
(一次调用多个库,包括dplyr
和 purrr
).
这是 set.seed(10)
的样子:
如果向下钻取最大块:
我觉得这很奇怪,但我猜这就是您开始寻找的内容。