如何修改R代码实现Stack Overflow样式的3层环形图(Donut Chart)
修改R代码实现多层依赖旭日/环形图
想要实现三层嵌套的依赖式旭日/环形图(内层总项、中间分类项、外层子分类项),以下是针对原始代码的修改方案:
核心修改内容
- 数据清洗与层级梳理:移除原始数据中重复的
Total行,明确三层层级关系:根节点Total(层级1)→ 一级分类Planerlöse/Abgeltung(层级2)→ 二级子分类(层级3) - 层级数据重构:移除无用的空父节点,修正各层级的父子映射逻辑,为无下级分类的
Planerlöse补充空占位,保证环形结构完整 - 可视化样式优化:调整透明度实现外层深、内层浅的视觉层次,优化标签显示逻辑避免重复,统一父类与子类的填充色系,移除冗余网格元素
完整修正代码
library(tidyverse) library(forcats) # 数据清洗与处理 df <- "name type value Total all 100 Planerlöse Total 54 Abgeltung Thurgau 30.24 Abgeltung Bund 23.8 Abgeltung Kanton Thurgau Netto 20.23 Abgeltung Gemeinden 9.98" %>% read_table2() %>% filter(type != "all") %>% distinct() # 去除重复行 # 构建层级数据 # 层级1:总项Total lvl1 <- tibble(name = "Total", value = 100, level = 1, fill = "Total") # 层级2:一级分类(Planerlöse和Abgeltung的总和) lvl2 <- df %>% group_by(name) %>% summarise(value = sum(value)) %>% ungroup() %>% mutate(level = 2, fill = name) # 层级3:二级子分类,为Planerlöse补充空占位保证环形结构完整 lvl3 <- df %>% select(name = type, value, fill = name) %>% mutate(level = 3) %>% bind_rows(tibble(name = NA, value = 0, fill = "Planerlöse", level = 3)) # 合并整理绘图数据 plot_data <- bind_rows(lvl1, lvl2, lvl3) %>% mutate( level = factor(level, levels = c(1,2,3)), fill = factor(fill), # 仅在对应层级显示有效标签 label = case_when( level == 1 ~ name, level == 2 ~ name, level == 3 & !is.na(name) ~ name, TRUE ~ NA_character_ ) ) %>% arrange(fill, level) # 绘制旭日/环形图 ggplot(plot_data, aes(x = level, y = value, fill = fill, alpha = level)) + geom_col(width = 1, color = "white", size = 0.3, position = position_stack()) + geom_text(aes(label = label), size = 2.8, position = position_stack(vjust = 0.5), color = "black") + coord_polar(theta = "y") + # 透明度设置:外层颜色最深,内层最浅 scale_alpha_manual(values = c("1" = 0.4, "2" = 0.7, "3" = 1), guide = "none") + # 自定义填充色,父类与子类使用同色系 scale_fill_manual( values = c( "Total" = "#e0e0e0", "Planerlöse" = "#1b9e77", "Abgeltung" = "#d95f02" ), na.translate = FALSE ) + # 隐藏坐标轴与刻度 scale_x_discrete(breaks = NULL) + scale_y_continuous(breaks = NULL) + labs(x = NULL, y = NULL) + theme_minimal() + theme(panel.grid = element_blank())
效果说明
生成的图表会呈现三层嵌套结构:
- 最内层为浅灰色的总项
Total - 中间层为
Planerlöse(深绿色)与Abgeltung(橙色)两个一级分类 - 最外层为
Abgeltung的子分类,与中间层Abgeltung使用同一橙色系,明确展示层级依赖关系
内容的提问来源于stack exchange,提问作者user11841097
相关产品推荐
相关产品推荐

