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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:42:38