R语言中用Plotly绘制Treemap显示空白界面?求助排查解决
Plotly树状图空白问题排查与修复
问题场景
使用R的Plotly绘制treemap时,运行代码后绘图界面完全空白。数据集构建及可视化代码如下:
数据集代码
library(treemap) library(plotly) library(dplyr) library(stringr) var1 <- c("A", "B", "C", "D", "E") var1<- sample(var1, 1000, replace=TRUE, prob=c(0.2, 0.2, 0.2, 0.2, 0.2)) var1<- as.factor(var1) var2 <- c("abc", "bcd", "egf", "hiu", "lkj", "oiu", "piu", "xsr", "zze", "tre") var2<- sample(var2, 1000, replace=TRUE, prob=c(0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1)) var2<- as.factor(var2) my_data = data.frame(var1, var2) my_data = data.frame(my_data %>% group_by(var1, var2) %>% summarise(counts = n()))
可视化代码
# visualization 1 (g4EMP1 <- plot_ly( data = my_data, type = "treemap", labels = ~var2 %>% stringr::str_wrap(width = 15), branchvalues = "total", values = ~counts, parents = ~var1)) # visualization 2 (g4EMP2 <- plot_ly( data = my_data, type = "treemap", labels = ~var2%>% stringr::str_wrap(width = 15), #values = ~size, parents = ~var1)) %>% layout(uniformtext = list(minsize = 10))
错误原因
- 缺失顶层父节点数据:Plotly的treemap要求所有父节点必须在数据集中单独占据一行,且父节点的
parents需设为空字符串(表示顶层节点)。当前数据仅包含子节点(var2)及其对应的父节点(var1),但没有var1自身的行,导致Plotly无法识别顶层结构。 - 缺失
values参数:第二个可视化代码中注释掉了values参数,treemap必须通过该参数定义每个区块的大小,缺失会直接导致渲染失败。
修复方案
步骤1:补充顶层父节点数据
先计算每个var1的总counts,然后将父节点行与原数据合并:
# 计算父节点的总counts parent_data <- my_data %>% group_by(var1) %>% summarise(counts = sum(counts), .groups = "drop") %>% rename(labels = var1) %>% mutate(parents = "") # 顶层节点的parents为空字符串 # 处理子节点数据,匹配格式 child_data <- my_data %>% rename(labels = var2, parents = var1) %>% select(labels, parents, counts) # 合并父节点和子节点数据 full_data <- bind_rows(parent_data, child_data)
步骤2:正确编写可视化代码
确保values参数存在,且使用完整的数据集:
# 修复后的visualization 1 (g4EMP1_fixed <- plot_ly( data = full_data, type = "treemap", labels = ~labels %>% stringr::str_wrap(width = 15), branchvalues = "total", values = ~counts, parents = ~parents )) # 修复后的visualization 2 (g4EMP2_fixed <- plot_ly( data = full_data, type = "treemap", labels = ~labels %>% stringr::str_wrap(width = 15), values = ~counts, parents = ~parents )) %>% layout(uniformtext = list(minsize = 10))
说明
branchvalues = "total"表示父节点的大小等于所有子节点大小之和,符合当前数据的统计逻辑。- 合并后的
full_data包含了顶层节点(A-E)和对应的子节点(abc、bcd等),Plotly可以正确识别层级结构并渲染树状图。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

