您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# ggplot如何构造连环饼图
## 前言
在数据可视化领域,饼图(Pie Chart)是一种常见的展示比例关系的图表类型。而"连环饼图"(Nested Pie Chart或Donut Chart with Layers)则是在传统饼图基础上发展出的进阶形式,它通过多层环形结构展示数据的层级关系,适用于呈现具有父子结构的分类数据。
本文将详细介绍如何使用R语言中的ggplot2包构建连环饼图,涵盖数据准备、基础饼图绘制、环形图转换、多层嵌套实现以及高级美化的完整流程。文章包含以下核心内容:
1. 理解连环饼图的数据结构要求
2. 使用geom_col()+coord_polar()创建基础饼图
3. 通过调整参数转换为环形图(甜甜圈图)
4. 实现多层嵌套的连环饼图
5. 颜色、标签、图例等视觉元素的优化
6. 交互式连环饼图的实现方案
---
## 一、数据结构准备
连环饼图需要特定的数据组织形式。理想的数据结构应包含:
- 分类变量(至少两个层级)
- 数值变量(用于确定扇形角度)
- 层级标识变量
### 示例数据集构造
```r
library(tidyverse)
# 创建示例数据
set.seed(123)
hierarchical_data <- tibble(
category_l1 = rep(c("A", "B", "C"), each = 4),
category_l2 = paste0(rep(c("X", "Y", "Z", "W"), 3), 1:12),
value = sample(10:50, 12, replace = TRUE)
) %>%
group_by(category_l1) %>%
mutate(prop_l1 = sum(value)) %>%
ungroup() %>%
mutate(prop_l2 = value)
该数据结构包含: - 一级分类(category_l1) - 二级分类(category_l2) - 原始数值(value) - 计算得到的一级比例(prop_l1) - 二级比例(prop_l2)
ggplot2本身没有直接的geom_pie()
函数,但可以通过geom_col()
+coord_polar()
组合实现:
basic_pie <- ggplot(hierarchical_data, aes(x = "", y = value, fill = category_l2)) +
geom_col(width = 1) +
coord_polar(theta = "y") +
theme_void()
print(basic_pie)
x = ""
:固定x轴为单一值theta = "y"
:指定使用y值作为角度基准width = 1
:确保条形宽度填满整个半径将饼图转为环形图(甜甜圈图)的核心是调整x轴映射:
donut_plot <- ggplot(hierarchical_data, aes(x = 2, y = value, fill = category_l2)) +
geom_col(width = 1) +
coord_polar(theta = "y") +
xlim(0.5, 2.5) + # 关键调整:控制内径和外径
theme_void()
print(donut_plot)
xlim(0.5, 2.5)
:0.5决定空心部分大小构建多层连环饼图需要巧妙组合多个几何对象:
nested_pie <- ggplot() +
# 第一层(外层)
geom_col(
data = hierarchical_data,
aes(x = 1.8, y = prop_l1, fill = category_l1),
width = 0.8
) +
# 第二层(内层)
geom_col(
data = hierarchical_data,
aes(x = 1.0, y = value, fill = category_l2),
width = 0.4
) +
coord_polar(theta = "y") +
scale_fill_manual(
values = c(
RColorBrewer::brewer.pal(3, "Set1"),
RColorBrewer::brewer.pal(12, "Paired")
)
) +
theme_void() +
theme(legend.position = "right")
print(nested_pie)
nested_pie_with_labels <- nested_pie +
# 外层标签
geom_text(
data = hierarchical_data %>%
group_by(category_l1) %>%
summarize(ypos = sum(value)/2),
aes(x = 1.8, y = ypos, label = category_l1),
size = 5, color = "white"
) +
# 内层标签
geom_text(
data = hierarchical_data %>%
mutate(ypos = cumsum(value) - value/2),
aes(x = 1.0, y = ypos, label = category_l2),
size = 3
)
print(nested_pie_with_labels)
nested_pie +
guides(fill = guide_legend(
title = "分类层级",
ncol = 2,
override.aes = list(size = 4)
)) +
theme(
legend.title = element_text(face = "bold"),
legend.text = element_text(size = 10)
)
使用plotly增强交互性:
library(plotly)
ggplotly(nested_pie_with_labels, tooltip = c("fill", "y"))
sales_data <- tibble(
region = rep(c("North", "South", "East", "West"), each = 3),
product = paste0(rep(c("Basic", "Pro", "Premium"), 4), "_", region),
revenue = c(120, 180, 250, 90, 130, 200, 80, 110, 160, 150, 210, 300)
)
ggplot(sales_data) +
geom_col(aes(x = 2, y = revenue, fill = region), width = 0.6) +
geom_col(aes(x = 1, y = revenue, fill = product), width = 0.4) +
coord_polar(theta = "y") +
xlim(0.5, 2.5) +
labs(title = "Regional Sales by Product Tier") +
theme_void()
time_data <- tibble(
year = rep(2020:2022, each = 4),
quarter = paste0("Q", rep(1:4, 3)),
value = c(15, 22, 18, 25, 17, 24, 20, 28, 20, 30, 25, 35)
)
ggplot(time_data) +
geom_col(aes(x = 2, y = value, fill = factor(year)), width = 0.7) +
geom_col(aes(x = 1, y = value, fill = quarter), width = 0.5) +
coord_polar(theta = "y") +
scale_fill_viridis_d(option = "plasma") +
xlim(0.5, 2.5)
A:可使用ggrepel
包或手动调整标签位置:
library(ggrepel)
# 在geom_text中使用geom_text_repel替代
A:确保数据中的因子水平正确设置:
data$category <- factor(data$category, levels = c("A", "B", "C"))
A:使用annotate:
+ annotate("text", x = 0, y = 0, label = "核心指标", size = 8)
连环饼图作为一种信息密集型的可视化形式,在展现层级结构数据时具有独特优势。通过ggplot2的灵活组合,我们可以构建出既美观又富有洞察力的多层环形可视化。关键要把握:
随着ggplot2生态的不断发展(如ggforce等扩展包),连环饼图的实现方式还将继续丰富。建议读者在实践中多尝试不同参数组合,开发出更适合特定场景的可视化方案。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。