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,因为它们提供了更强大的定制能力和更好的视觉效果。