1. 引言
饼图(Pie Chart)是数据可视化中最直观的图表类型之一,它通过扇形的角度或面积来展示各部分在整体中所占的比例。在 R 语言中,饼图的绘制方法多样,既可以使用基础绘图系统,也可以借助 ggplot2 等高级绘图包实现更美观、更灵活的定制。本文将系统介绍 R 中绘制饼图的多种方法,并提供丰富的可运行代码实例。
2. 基础饼图:pie() 函数
R 基础绘图系统提供了 pie() 函数,用于快速绘制饼图。其基本语法如下:
pie(x, labels = names(x), edges = 200, radius = 0.8,
clockwise = FALSE, init.angle = if (clockwise) 90 else 0,
col = NULL, border = NULL, main = NULL)
其中,x 是一个数值向量,labels 用于指定每个扇区的标签,col 用于设置颜色,main 用于添加标题。下面是一个最简单的饼图示例:
# 示例数据:某班级学生最喜欢的科目
subjects <- c(数学 = 12, 语文 = 8, 英语 = 10, 物理 = 6, 化学 = 4)
绘制基础饼图
pie(subjects,
main = "学生最喜欢的科目分布",
col = c("lightblue", "lightgreen", "lightyellow", "lightpink", "lightcyan"))
运行上述代码后,R 会生成一个带有默认标签和标题的饼图。需要注意的是,pie() 函数默认按数据向量的顺序绘制扇区,从 3 点钟方向开始逆时针排列。
3. 自定义饼图外观
基础饼图虽然简单,但外观较为朴素。我们可以通过调整参数来美化图表,例如设置扇区边框颜色、调整起始角度、控制绘制方向等。
3.1 设置边框与起始角度
# 设置边框颜色和起始角度
pie(subjects,
main = "带边框的饼图",
col = c("steelblue", "tomato", "gold", "mediumseagreen", "orchid"),
border = "white",
init.angle = 90, # 从 12 点钟方向开始
clockwise = TRUE) # 顺时针排列
3.2 添加百分比标签
默认的饼图标签只显示名称,不显示比例。我们可以通过计算百分比来生成更丰富的标签:
# 计算百分比
pct <- round(subjects / sum(subjects) * 100, 1)
labels <- paste(names(subjects), "(", pct, "%)", sep = "")
绘制带百分比标签的饼图
pie(subjects,
labels = labels,
main = "学生最喜欢的科目分布(含百分比)",
col = c("steelblue", "tomato", "gold", "mediumseagreen", "orchid"),
border = "white",
cex = 0.9) # 调整标签字体大小
4. 使用 ggplot2 绘制饼图
ggplot2 是 R 中最流行的数据可视化包,虽然它没有直接提供 geom_pie() 函数,但可以通过 coord_polar() 将条形图转换为饼图。这种方法更加灵活,便于后续的美化和定制。
4.1 安装并加载 ggplot2
# 安装 ggplot2(如果尚未安装)
# install.packages("ggplot2")
加载 ggplot2
library(ggplot2)
4.2 基础 ggplot2 饼图
# 准备数据框
df <- data.frame(
subject = c("数学", "语文", "英语", "物理", "化学"),
count = c(12, 8, 10, 6, 4)
)
绘制饼图
ggplot(df, aes(x = "", y = count, fill = subject)) +
geom_bar(stat = "identity", width = 1) +
coord_polar(theta = "y") +
labs(title = "学生最喜欢的科目分布(ggplot2)") +
theme_void() # 去除背景和坐标轴
4.3 添加百分比标签
# 计算百分比
df$pct <- round(df$count / sum(df$count) * 100, 1)
df$label <- paste(df$subject, "(", df$pct, "%)", sep = "")
绘制带标签的饼图
ggplot(df, aes(x = "", y = count, fill = subject)) +
geom_bar(stat = "identity", width = 1) +
coord_polar(theta = "y") +
geom_text(aes(label = label),
position = position_stack(vjust = 0.5),
size = 4) +
labs(title = "学生最喜欢的科目分布(含百分比标签)") +
theme_void()
5. 环形图(Donut Chart)
环形图是饼图的一种变体,中间有一个空心圆,视觉效果更加现代。在 ggplot2 中,只需在饼图的基础上添加一个空白的中心圆即可实现。
# 绘制环形图
ggplot(df, aes(x = 2, y = count, fill = subject)) +
geom_bar(stat = "identity", width = 1) +
coord_polar(theta = "y") +
geom_text(aes(label = label),
position = position_stack(vjust = 0.5),
size = 4) +
xlim(0.5, 2.5) + # 通过限制 x 轴范围制造空心效果
labs(title = "学生最喜欢的科目分布(环形图)") +
theme_void()
在上面的代码中,xlim(0.5, 2.5) 将 x 轴的范围限制在 0.5 到 2.5 之间,使得条形图只占据外圈部分,从而形成环形效果。
6. 3D 饼图
虽然 3D 饼图在数据可视化领域存在一定争议(因为 3D 透视会扭曲比例感知),但在某些场景下仍然有展示需求。R 中可以使用 plotrix 包的 pie3D() 函数绘制 3D 饼图。
# 安装并加载 plotrix 包
# install.packages("plotrix")
library(plotrix)
绘制 3D 饼图
pie3D(subjects,
main = "学生最喜欢的科目分布(3D 饼图)",
col = c("steelblue", "tomato", "gold", "mediumseagreen", "orchid"),
explode = 0.1, # 扇区分离程度
labels = paste(names(subjects), pct, "%", sep = " "),
labelcex = 0.8)
其中,explode 参数控制扇区之间的分离距离,labelcex 用于调整标签字体大小。
7. 多面板饼图
当需要对比多组数据的构成时,可以使用 par(mfrow) 将多个饼图排列在同一画布上。
# 两组示例数据
class_a <- c(数学 = 12, 语文 = 8, 英语 = 10, 物理 = 6, 化学 = 4)
class_b <- c(数学 = 10, 语文 = 9, 英语 = 12, 物理 = 5, 化学 = 6)
设置 1 行 2 列的布局
par(mfrow = c(1, 2))
绘制两个饼图
pie(class_a, main = "A 班科目分布",
col = c("steelblue", "tomato", "gold", "mediumseagreen", "orchid"))
pie(class_b, main = "B 班科目分布",
col = c("steelblue", "tomato", "gold", "mediumseagreen", "orchid"))
恢复默认布局
par(mfrow = c(1, 1))
8. 使用 plotly 绘制交互式饼图
如果希望饼图具备交互能力(如悬停显示数值、点击高亮等),可以使用 plotly 包。
# 安装并加载 plotly 包
# install.packages("plotly")
library(plotly)
绘制交互式饼图
plot_ly(df,
labels = ~subject,
values = ~count,
type = "pie",
textinfo = "label+percent",
title = "学生最喜欢的科目分布(交互式)")
运行上述代码后,会在 RStudio 的 Viewer 窗口或浏览器中打开一个可交互的饼图,鼠标悬停在扇区上即可查看详细数值和百分比。
9. 饼图使用建议
饼图虽然直观,但在实际使用中需要注意以下几点:
- 扇区数量不宜过多:当类别超过 6 个时,饼图的可读性会显著下降,建议改用条形图。
- 避免 3D 效果:3D 透视会扭曲扇区的视觉面积,影响读者对比例的准确判断。
- 标注百分比:在扇区上标注具体数值或百分比,可以帮助读者更准确地理解数据。
- 对比多组数据时慎用:如果需要对比多组数据的构成,使用堆叠条形图或分面条形图通常更清晰。
10. 总结
本文系统介绍了 R 中绘制饼图的多种方法,包括基础 pie() 函数、ggplot2 饼图与环形图、3D 饼图、多面板饼图以及 plotly 交互式饼图。每种方法都配有完整的可运行代码示例,读者可以根据实际需求选择合适的方式。在实际项目中,建议优先使用 ggplot2 或 plotly,因为它们提供了更强大的定制能力和更好的视觉效果。
网硕互联帮助中心


评论前必须登录!
注册