使用R语言ggplot2+ggpattern保存图表时如何保留图例条纹图案
解决ggpattern图例条纹图案保存丢失问题
使用ggpattern绘制带条纹、圆点图案的柱状图时,保存为PNG等图片格式后,图例中的条纹图案消失,但圆点图案显示正常。以下是问题复现代码:
library(tidyverse) library(ggplot2) library(ggpattern) data <- data.frame(OBS_VALUE = rnorm(12, 10), COUNTRY = c(rep(c("Flat"), times=6), rep(c("House"), times=6)), SERIES_NAME = rep(c(rep(c("price"), times=3), rep(c("cost"), times=3)), times=2), OBS_DATE = rep(seq(as.Date("2020-01-01"), as.Date("2022-01-01"), "years"), times=4) ) chart = data %>% ggplot( aes(x=OBS_DATE, y=OBS_VALUE)) + geom_col_pattern( aes(pattern = SERIES_NAME), position = position_dodge(), fill = 'red', colour = 'red', pattern_density = 0.5, pattern_fill = 'white', pattern_colour = 'white' )+ scale_pattern_manual(values = c(price = "stripe", cost = "circle")) + facet_grid(~COUNTRY) ggsave( "chart_test.png" , plot = chart, scale = 1, width = 20, height = 10, units = "cm", dpi=320 )
保存后的图表效果:
可行解决建议
1. 使用ragg设备渲染
ggsave默认的PNG设备对ggpattern的复杂图案支持有限,改用ragg包的agg_png设备能更好地渲染图案细节:
首先安装ragg包:
install.packages("ragg")
修改ggsave代码:
ggsave( "chart_test.png", plot = chart, scale = 1, width = 20, height = 10, units = "cm", dpi = 320, device = ragg::agg_png )
2. 调整图案密度与尺寸
部分情况下,条纹图案密度过低或尺寸太小,保存时被压缩导致显示异常,可尝试调整参数:
geom_col_pattern( aes(pattern = SERIES_NAME), position = position_dodge(), fill = 'red', colour = 'red', pattern_density = 0.7, # 增大条纹密度 pattern_fill = 'white', pattern_colour = 'white', pattern_size = 1.2 # 调整图案线条粗细 )
3. 先存矢量格式再转PNG
若上述方法无效,先保存为SVG/PDF等矢量格式(完整保留图案),再转为PNG:
# 保存为SVG ggsave("chart_test.svg", plot = chart, width = 20, height = 10, units = "cm") # 用rsvg包转PNG(先安装包) install.packages("rsvg") rsvg::rsvg_png("chart_test.svg", "chart_test.png", width = round(20*320/2.54), height = round(10*320/2.54))
内容的提问来源于stack exchange,提问作者masamo21
相关产品推荐
相关产品推荐

