R 绘图 – 饼图(手把手讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言:为什么选择饼图?
在数据可视化领域,R 绘图 – 饼图是展示数据比例关系的经典工具。它以直观、简洁的方式将分类数据的占比清晰呈现,尤其适合向非技术背景的受众传达关键信息。无论是市场调研中的用户群体分布,还是财务报告中的预算分配,饼图都能快速抓住读者的注意力。
对于编程初学者和中级开发者而言,掌握饼图的绘制技巧不仅能提升数据表达能力,还能为后续学习其他复杂图表(如热力图、动态可视化)打下坚实基础。本文将从零开始,逐步讲解 R 语言中饼图的实现方法,并结合案例演示如何通过代码优化图表的视觉效果。
一、基础语法:用 pie() 函数创建饼图
1.1 准备数据
饼图的核心是展示数据的占比关系,因此数据需要满足以下条件:
- 数据必须为非负数值;
- 数据总和无需等于 100%,但会自动按比例计算。
例如,假设我们想展示某公司部门的人数分布,数据可以整理为以下向量:
departments <- c("销售", "技术", "市场", "行政")
counts <- c(45, 30, 20, 5)
1.2 绘制基础饼图
使用 R 内置的 pie()
函数即可快速生成饼图:
pie(counts, labels = departments, main = "部门人数分布")
counts
:数据向量,决定每个扇形区域的大小;labels
:分类名称,默认显示数值;main
:图表标题。
1.3 结果分析
执行上述代码后,R 会生成一个简单的饼图,但默认样式可能较为朴素。例如:
- 颜色随机分配,可能难以区分不同类别;
- 标签可能重叠,尤其是当类别名称较长时。
二、自定义样式:让饼图更专业
2.1 颜色定制
通过 col
参数指定颜色,可以显著提升图表的可读性和美观度。例如:
colors <- c("#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4")
pie(counts, labels = departments, col = colors, main = "部门人数分布(颜色优化)")
- 使用十六进制颜色代码(如
#FF6B6B
)可精确控制颜色; - 颜色搭配建议:
- 对比色(如红与蓝)适合强调差异;
- 渐变色(如蓝到绿)适合连续分类。
2.2 标签与文字调整
2.2.1 标签位置与格式
通过 label.cex
调整标签字体大小,clockwise = TRUE
可按顺时针排列标签:
pie(counts,
labels = paste(departments, counts, sep = "\n"), # 换行显示名称和数值
label.cex = 0.8,
clockwise = TRUE,
main = "带数值的饼图"
)
2.2.2 拆分扇形(Exploding)
使用 explode
参数突出显示某个类别:
library(plotrix) # 需要先安装 plotrix 包
pie3D(counts,
labels = departments,
explode = 0.1, # 拆分程度
main = "3D 饼图(销售部门突出显示)"
)
2.3 添加图例
默认饼图不显示图例,可通过 legend()
函数手动添加:
pie(counts, labels = NA) # 关闭默认标签
legend("topright",
departments,
fill = colors,
title = "部门",
cex = 0.8
)
三、进阶技巧:3D 效果与交互式图表
3.1 3D 饼图
使用 plotrix
包的 pie3D()
函数,可为图表添加立体效果:
library(plotrix)
pie3D(counts,
labels = departments,
col = colors,
main = "3D 饼图",
theta = 45 # 观察角度
)
3.2 交互式图表:Shiny 应用
通过 shiny
包,可创建动态交互界面,允许用户通过下拉菜单切换数据集:
library(shiny)
ui <- fluidPage(
selectInput("dataset", "选择数据集:",
choices = list("部门人数" = "counts", "其他数据" = "other_data")),
plotOutput("pie_plot")
)
server <- function(input, output) {
output$pied_plot <- renderPlot({
if (input$dataset == "counts") {
pie(counts, labels = departments)
} else {
pie(other_data, labels = other_labels)
}
})
}
shinyApp(ui, server)
四、常见问题与解决方案
4.1 标签重叠如何处理?
- 方法 1:缩短标签名称或使用缩写;
- 方法 2:调整字体大小或旋转图表:
pie(counts, labels = departments, clockwise = TRUE, cex = 0.7)
4.2 如何保存高分辨率图片?
使用 png()
或 pdf()
函数设置输出格式:
png("pie_chart.png", width = 800, height = 600)
pie(counts, labels = departments)
dev.off()
4.3 数据量过多时饼图是否适用?
- 建议:当类别超过 5-7 个时,改用堆叠柱状图或条形图,避免信息过载;
- 替代方案:使用
ggplot2
的geom_bar()
绘制条形图:library(ggplot2) df <- data.frame(Department = departments, Count = counts) ggplot(df, aes(x = "", y = Count, fill = Department)) + geom_bar(width = 1, stat = "identity") + coord_polar("y") + # 转换为饼图 ggtitle("部门人数分布")
五、实战案例:分析全球咖啡消费分布
5.1 数据准备
假设我们有以下数据(单位:百万公斤):
| 国家 | 消费量 |
|------------|--------|
| 美国 | 4500 |
| 巴西 | 2800 |
| 德国 | 1600 |
| 日本 | 900 |
| 其他 | 2200 |
5.2 代码实现
countries <- c("美国", "巴西", "德国", "日本", "其他")
coffee <- c(4500, 2800, 1600, 900, 2200)
pie(coffee,
labels = paste0(countries, "\n", coffee),
col = rainbow(5),
main = "全球咖啡消费量分布(2023)",
cex = 0.8
)
5.3 结果解读
- 美国以约 37% 的占比位居第一;
- “其他”类别占比 18%,说明数据需进一步细分;
- 颜色与标签的组合使图表更易理解。
结论:饼图的适用场景与局限性
R 绘图 – 饼图 是数据可视化中不可或缺的工具,尤其在以下场景表现优异:
- 优势:直观展示比例关系、适合小类别数量;
- 局限性:数据过多时易混淆、不适用于精确数值比较。
通过本文的学习,读者应能掌握从基础语法到高级定制的完整流程。建议后续结合实际项目实践,并探索 ggplot2
等高级包,以进一步提升图表的表达力。记住,优秀的数据可视化不仅是技术的体现,更是与受众沟通的艺术。