如何用R的ggplot创建带图像填充的百分比可视化图表?
用ggplot实现自定义图像填充的百分比图表
当然可以用ggplot搞定这种自定义图像填充的百分比图表!我给你分享两种实用的实现思路,分别对应不同的展示风格,你可以根据需求选择:
方法1:区域填充式(适合连续百分比)
这种方式是把一个条形的指定比例区域用重复的图像填充,剩下部分留空或用背景色,和你用Excel修改条形图的思路类似。我们需要用到ggpattern包来实现图像填充:
步骤1:安装并加载依赖包
install.packages(c("ggplot2", "ggpattern", "magick")) library(ggplot2) library(ggpattern) library(magick)
步骤2:处理图像(可选,让背景透明更美观)
如果你的人像图有白色背景,先用magick去掉背景:
# 读取图像并去除白色背景 transparent_img <- image_read("your-person-image.png") %>% image_transparent("white", fuzz = 20) # fuzz值可根据图像调整 image_write(transparent_img, "transparent-person.png")
步骤3:构建图表
# 准备数据,这里以75%为例 df <- data.frame( group = "用户占比", percentage = 0.75 ) ggplot(df, aes(x = group, y = 1)) + # 绘制基础背景条形 geom_col(fill = "#f0f0f0", color = "gray30") + # 绘制填充图像的百分比区域 geom_col_pattern( aes(y = percentage), pattern = "image", pattern_filename = "transparent-person.png", # 替换为你的透明图像路径 pattern_scale = 0.15, # 调整图像大小,数值越小图像越小 pattern_repeat = "repeat", # 重复填充图像 fill = "transparent", color = "gray30" ) + # 添加百分比文本 geom_text(aes(y = percentage/2, label = paste0(percentage*100, "%")), size = 6, color = "black") + # 美化主题,隐藏多余元素 theme_minimal() + theme( axis.text = element_blank(), axis.title = element_blank(), panel.grid = element_blank(), plot.margin = margin(20, 20, 20, 20) )
方法2:离散图标式(适合直观展示比例)
这种方式是用多个小图标排列,显示对应比例的填充图标(比如10个图标显示8个填充的代表80%),视觉上更活泼。我们用ggimage包实现:
步骤1:安装并加载依赖包
install.packages(c("ggplot2", "ggimage")) library(ggplot2) library(ggimage)
步骤2:准备数据
假设我们要展示80%,准备10个图标的位置数据,其中8个用填充人像,2个用灰色/空白人像:
# 生成10个图标的坐标 icon_df <- data.frame( x = rep(1:5, 2), # 5列2行排列 y = rep(2:1, each = 5), # 前8个用填充图像,后2个用空白/灰色图像 image_path = c(rep("filled-person.png", 8), rep("empty-person.png", 2)) )
步骤3:构建图表
ggplot(icon_df, aes(x = x, y = y)) + geom_image(aes(image = image_path), size = 0.12) + # size调整图标大小 # 添加百分比标题 labs(title = "80%") + # 隐藏所有坐标轴和网格 theme_void() + theme( plot.title = element_text(hjust = 0.5, size = 18, face = "bold"), plot.margin = margin(10, 10, 10, 10) )
总结
- 区域填充式适合展示任意连续百分比,和你Excel的实现逻辑一致;
- 离散图标式更适合整数比例或需要更直观视觉效果的场景;
- 两种方法都可以完全在ggplot中实现,不需要依赖plotly。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

