如何用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
相关产品推荐
相关产品推荐

