You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 03:48:24