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

如何用ggpattern为R语言scatterpie饼图添加class分组图案?

解决scatterpie结合图案区分class的问题

方案1:用geom_point_pattern做背景图案+scatterpie叠层

scatterpie原生不支持ggpattern的图案美学,可先在每个饼图位置绘制带图案的圆形背景,再叠加半透明饼图,通过背景图案区分class:

library(ggplot2)
library(scatterpie)
library(ggpattern)
library(dplyr)

# 构造示例数据
set.seed(123)
df <- data.frame(
  x = rnorm(10),
  y = rnorm(10),
  class = sample(c("A", "B", "C"), 10, replace = TRUE),
  val1 = runif(10),
  val2 = runif(10),
  val3 = runif(10),
  r = 0.1 # 饼图半径
)

# 绘图:先画图案背景,再叠半透明饼图
ggplot() +
  # 带图案的圆形背景,匹配饼图位置和大小
  geom_point_pattern(
    data = df,
    aes(x = x, y = y, pattern = class, fill = class),
    size = df$r * 20, # 调整size匹配饼图半径(需根据实际情况微调)
    pattern_fill = "black",
    pattern_density = 0.3,
    pattern_spacing = 0.02
  ) +
  # 绘制scatterpie饼图,设置半透明让图案透出
  geom_scatterpie(
    data = df,
    aes(x = x, y = y, r = r),
    cols = c("val1", "val2", "val3"),
    alpha = 0.7
  ) +
  # 自定义图案样式
  scale_pattern_manual(values = c(A = "stripe", B = "crosshatch", C = "dot")) +
  scale_fill_viridis_d(option = "D") +
  theme_minimal()

方案2:用ggforce+ggpattern手动绘制带图案的饼图切片

如果需要给饼图的每个切片(或整个饼)添加对应class的图案,可使用ggforce::geom_arc_bar_pattern直接绘制,完全支持ggpattern的美学映射:

library(ggplot2)
library(ggpattern)
library(ggforce)
library(tidyr)
library(dplyr)

# 构造并整理数据为长格式
set.seed(123)
df <- data.frame(
  x = rnorm(10),
  y = rnorm(10),
  class = sample(c("A", "B", "C"), 10, replace = TRUE),
  val1 = runif(10),
  val2 = runif(10),
  val3 = runif(10),
  r = 0.1
)

df_long <- df %>%
  pivot_longer(cols = starts_with("val"), names_to = "category", values_to = "value") %>%
  group_by(x, y, class) %>%
  mutate(
    total = sum(value),
    angle_start = cumsum(lag(value, default = 0)) / total * 2 * pi,
    angle_end = cumsum(value) / total * 2 * pi
  )

# 绘制带图案的饼图,pattern映射class区分分组
ggplot(df_long, aes(
  x0 = x, y0 = y, r0 = 0, r = r,
  start = angle_start, end = angle_end,
  pattern = class, fill = category
)) +
  geom_arc_bar_pattern(
    pattern_fill = "black",
    pattern_density = 0.3,
    pattern_spacing = 0.02
  ) +
  scale_pattern_manual(values = c(A = "stripe", B = "crosshatch", C = "dot")) +
  scale_fill_viridis_d(option = "D") +
  coord_fixed() +
  theme_minimal()

替代可视化思路

如果图案区分仍不理想,可尝试:

  • 用颜色+图案的组合强化区分(比如不同class用不同底色+不同图案)
  • 给每个饼图添加对应class的文本标注(geom_text(aes(label = class), nudge_x = 0.1))
  • 用不同的饼图边框样式(linetype+size)结合图案
  • 若class数量不多,可将XY平面按class分面(facet_wrap(~class)),每个分面内绘制对应class的饼图

内容的提问来源于stack exchange,提问作者user1701545

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 04:17:18