如何在R中绘制带leader lines(引导线)的3D饼图
R实现带Excel风格引导线的3D饼图
完整可运行代码
library(plotrix) # 基础配置 x <- c(20, 20, 20, 20, 20) labels <- c('breakfast', 'brunch', 'lunch', 'snacks', 'dinner') colors <- c('#4286f4','#bb3af2','#ed2f52','#efc023','#ea7441') radius_val <- 0.5 explode_val <- 0.1 height_val <- 0.05 theta_val <- pi/6 # 3D透视角度,和pie3D默认参数一致,用于坐标计算 # 引导线配置 leader_inner_offset <- 0.02 # 引导线起点离扇区表面的间距,避免贴合过紧 leader_break_len <- 0.15 # 第一段引导线长度(从扇区向外延伸的部分) leader_label_gap <- 0.08 # 折点到标签的水平间距 # 输出图片 png(file = "diet3d.png", width = 800, height = 600, res = 100) # 绘制3D饼图,不使用原生标签,保存返回的扇区中点弧度值 pie_angles <- pie3D(x, explode = explode_val, height = height_val, main = 'Daily Diet Plan', col = colors, radius = radius_val, theta = theta_val) # 循环为每个扇区绘制引导线和标签 for (i in seq_along(pie_angles)) { ang <- pie_angles[i] # 计算引导线起点(扇区边缘外) x1 <- (radius_val + explode_val + leader_inner_offset) * cos(ang) y1 <- (radius_val + explode_val + leader_inner_offset) * sin(ang) * sin(theta_val) # 计算引导线折点坐标 x2 <- (radius_val + explode_val + leader_inner_offset + leader_break_len) * cos(ang) y2 <- (radius_val + explode_val + leader_inner_offset + leader_break_len) * sin(ang) * sin(theta_val) # 计算引导线终点(标签旁) x3 <- x2 + ifelse(cos(ang) > 0, leader_label_gap, -leader_label_gap) y3 <- y2 # 绘制两段式引导线,样式和Excel一致 segments(x1, y1, x2, y2, col = "gray50", lwd = 1) segments(x2, y2, x3, y3, col = "gray50", lwd = 1) # 绘制标签,左右半区自动调整对齐方式 text(x3, y3, labels = labels[i], pos = ifelse(cos(ang) > 0, 4, 2), cex = 0.9) } dev.off()
关键逻辑说明
- 取消
pie3D函数原生的labels参数,改为自定义绘制标签,方便和引导线精准对齐 - 利用
pie3D返回的扇区中点弧度值计算各节点坐标,适配3D透视对Y轴的缩放比例,引导线不会出现错位 - 引导线采用两段折线设计,和Microsoft Excel的leader lines样式完全匹配,颜色设为中性灰避免干扰扇区的色彩展示
- 标签对齐方式根据扇区所在的左右半区自动调整,避免标签溢出画布范围
内容的提问来源于stack exchange,提问作者Prasanth Nv
相关产品推荐
相关产品推荐

