R语言进阶:从基础饼图到环形图与标签优化的实战指南
1. 基础饼图绘制从R原生函数到ggplot2进阶R语言中绘制饼图主要有两种方式基础绘图系统的pie()函数和基于ggplot2的进阶方法。基础pie()函数确实简单易用但存在明显的局限性——比如默认只有6种颜色循环使用、标签位置调整困难等问题。我刚开始用R做数据分析时也经常被这些问题困扰后来发现自定义颜色是解决问题的第一步。比如这个疾病统计数据的例子ratio - c(24.2, 21.9, 7.6, 5.2, 4.3, 3.2, 2.6, 2.6, 1.8, 1.8, 24.8) disease - c(Heart disease, Cancer, injuries, CPD, Stroke, Type2 diabetes, AD, Suicide, IP, Chronic liver disease, Other) colors - c(#E5D2DD, #53A85F, #F1BB72, #F3B1A0, #D6E7A3, #57C3F3, #476D87, #E59CC4, #AB3282, #23452F, #BD956A) pie(ratio, labelsdisease, colcolors, radius1.0, clockwiseTRUE)但ggplot2才是真正的生产力工具。虽然学习曲线陡峭但一旦掌握就会发现其强大之处。用ggplot2绘制基础饼图需要理解一个核心概念饼图本质上是堆叠条形图极坐标系转换。这个认知转变对我后来的可视化工作帮助很大。2. 环形图空心饼图制作技巧环形图在学术报告中越来越常见它比传统饼图多了中心空间可以用来展示摘要信息。用ggplot2配合ggforce包实现环形图其实非常简单——只需要调整geom_arc_bar中的半径参数r0。我第一次尝试做环形图时犯了个典型错误直接修改了原始饼图代码中的r参数结果得到了一个非常小的饼图。后来才明白r0和r的关系r0内半径设为0就是实心饼图r外半径 两者差值决定了环形的宽度library(ggplot2) library(ggforce) A - data.frame(ratio, disease) ggplot() geom_arc_bar(dataA, statpie, aes(x00, y00, r01, r2, amountratio, filldisease)) scale_fill_manual(valuescolors) theme_void()环形图的中心空白区域大有可为。我常在那里添加总结性文字或关键指标比如在这个疾病统计案例中可以添加Top3占比71.7%这样的信息。用annotate()函数就能轻松实现last_plot() annotate(text, x0, y0, labelTop3占比71.7%, size6, fontfacebold)3. 标签自动计算与防重叠策略原始方法使用annotate()手动添加标签既繁琐又难以维护。我在实际项目中开发了一套自动化解决方案主要依赖数据预处理和geom_text_repel的组合。关键步骤是计算每个扇区的中心角度和标签位置。这里用到了一些三角函数知识library(dplyr) library(ggrepel) A_pies - A %% mutate(end_angle 2*pi*cumsum(ratio)/sum(ratio), start_angle lag(end_angle, default0), mid_angle (start_angle end_angle)/2, hjust ifelse(mid_anglepi, 1, 0), vjust ifelse(mid_anglepi/2 | mid_angle3*pi/2, 0, 1)) ggplot(A_pies) geom_arc_bar(aes(x00, y00, r00, r1, startstart_angle, endend_angle, filldisease)) geom_text_repel(aes(x1.1*sin(mid_angle), y1.1*cos(mid_angle), labelpaste0(ratio,%), hjusthjust, vjustvjust), size3.5, show.legendFALSE) scale_fill_manual(valuescolors) coord_fixed() theme_void()对于环形图标签位置需要额外考虑半径因素。我的经验法则是将标签放在(r0r)/2的位置这样既不会太靠近中心也不会太靠近外缘。4. 高级应用分割饼图与多层嵌套分割饼图Exploded pie chart可以强调特定扇区。在ggforce中通过explode参数实现这个参数接受一个数值向量指定每个扇区的偏移量。注意偏移量不宜过大否则会影响整体美观。ggplot() geom_arc_bar(dataA, statpie, aes(x00, y00, r00.5, r1, amountratio, filldisease, explodesample(c(0,0.1),11,TRUE)), colorwhite) scale_fill_manual(valuescolors)多层嵌套饼图适合展示层级结构数据。实现的关键是使用多个geom_arc_bar层每层使用不同的半径范围。我在分析销售数据时常用这种图表展示大区-省份-城市三级结构# 假设有两层数据 A1 - data.frame(ratioratio[1:3], diseasedisease[1:3], levelL1) A2 - data.frame(ratioratio[4:11], diseasedisease[4:11], levelL2) ggplot() geom_arc_bar(dataA1, aes(x00, y00, r00, r0.7, amountratio, filldisease)) geom_arc_bar(dataA2, aes(x00, y00, r00.7, r1, amountratio, filldisease)) scale_fill_manual(valuescolors) theme_void()这种图表需要注意颜色搭配不同层级最好使用同一色系的不同饱和度避免产生视觉混乱。