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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:31:08