如何在R中制作含小数数值的人形华夫饼图(Waffle Plot)
解决R华夫饼图小数占比的半色人形图标问题
waffle包默认仅支持整数数量的图标,无法直接生成半色图标体现小数占比。要实现97.5个黑色、2.5个蓝色人形的效果,需手动添加半色图标覆盖到华夫饼的对应位置,具体步骤如下:
步骤1:加载所需包
确保安装并加载waffle、ggplot2和grid包:
install.packages(c("waffle", "ggplot2", "grid")) library(waffle) library(ggplot2) library(grid)
步骤2:绘制基础整数华夫饼图
先绘制97个黑色人形、3个蓝色人形的基础图(凑够100个图标),后续将其中1个蓝色图标替换为半黑半蓝:
p <- waffle( c(`No-disease` = 97, `Disease` = 3), rows = 10, colors = c("black", "blue"), use_glyph = "female", glyph_size = 10, title = 'Percentage of disease', legend_pos = "bottom" )
步骤3:替换指定图标为半色样式
提取绘图的grid对象,在最后一个蓝色图标的位置叠加半黑半蓝的人形图标:
# 初始化grid绘图设备 grid.newpage() grob <- ggplotGrob(p) grid.draw(grob) # 定位最后一个图标的坐标(10行10列的最后一个格子) pushViewport(ggplot2:::plotViewport(grob$vp)) pushViewport(grob$children$panel$vp) # 绘制左半部分黑色人形(裁剪显示左半) clip_left <- polygonGrob( x = unit(c(9.5, 10, 10, 9.5), "native"), y = unit(c(0.5, 0.5, 1.5, 1.5), "native"), gp = gpar(fill = NA) ) pushViewport(clipViewport(clip_left)) grid.draw(waffle:::glyphGrob( "female", x = unit(10, "native"), y = unit(1, "native"), size = unit(10, "pt"), gp = gpar(col = "black", fill = "black") )) popViewport() # 绘制右半部分蓝色人形(裁剪显示右半) clip_right <- polygonGrob( x = unit(c(10, 10.5, 10.5, 10), "native"), y = unit(c(0.5, 0.5, 1.5, 1.5), "native"), gp = gpar(fill = NA) ) pushViewport(clipViewport(clip_right)) grid.draw(waffle:::glyphGrob( "female", x = unit(10, "native"), y = unit(1, "native"), size = unit(10, "pt"), gp = gpar(col = "blue", fill = "blue") )) popViewport(2)
补充说明
- 若需要上下半色的图标,只需调整裁剪多边形的y坐标范围即可。
- 可手动修改图例标签,确保显示
No-disease (97.5)和Disease (2.5)的准确说明。
内容的提问来源于stack exchange,提问作者mendeaj
相关产品推荐
相关产品推荐

