news 2026/9/16 8:10:26

R 绘图 - 饼图:从基础到进阶的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
R 绘图 - 饼图:从基础到进阶的完整指南

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 8:09:59

eICU没有ventilation_event?手把手重建机械通气事件

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/16 8:09:04

Agent技能体系化设计:从Function Calling到可复用技能系统

1. 这不是一个工具&#xff0c;而是一套组织Agent能力的思维方式这半年只要你在搞LLM应用&#xff0c;就绕不开一个词&#xff1a;Agent。但真正上手做过的朋友应该都有体会&#xff0c;做个能聊天的Demo容易&#xff0c;做一只能“干活”的Agent难。难在哪儿&#xff1f;难在怎…

作者头像 李华
网站建设 2026/9/16 8:08:02

小程序番茄钟状态机实现与生命周期适配

简介&#xff1a;这是一份面向小程序初学者与时间管理类应用开发者的番茄工作法实践源码&#xff0c;提供开箱即用的微信小程序完整实现方案。资源包含核心功能模块&#xff1a;任务计时、专注/休息状态切换、历史记录查看、界面动效&#xff08;GIF演示&#xff09;及响应式UI…

作者头像 李华
网站建设 2026/9/16 8:06:53

Jetson边缘AI开发能力地图:从驱动安装到工业部署

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华