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 个时,改用堆叠柱状图或条形图,避免信息过载;
  • 替代方案:使用 ggplot2geom_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 等高级包,以进一步提升图表的表达力。记住,优秀的数据可视化不仅是技术的体现,更是与受众沟通的艺术。

最新发布