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

使用ggplot2的ggsave导出饼图时出现视觉伪影求助

ggplot2饼图ggsave保存后中心出现伪影的排查与解决

问题背景

使用ggplot2绘制饼图时,RStudio绘图窗口预览完全正常,但通过ggsave保存为PNG文件后,饼图切片中心交汇处出现额外小标记,类似切片未对齐的伪影。同款设备(旧款Macbook,R 4.2.3、RStudio 2022.07.02、Tidyverse 2.0.0)、相同代码,其他用户运行无异常。

示例数据与代码:

library(tidyverse)

df <- tibble(impact = factor(c("low", "modifier", "moderate", "high")), 
             count = c(1, 98, 23, 2)) 

绘图及保存代码:

pie <-  df |>
  ggplot(mapping = aes(x ="", y = count, fill = impact)) +
  geom_col(width = 1, color = 1) +
  coord_polar("y", start=0) + 
   theme(axis.line=element_blank(),
        axis.text.x=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks=element_blank(),
        axis.title.x=element_blank(),
        axis.title.y=element_blank(),
        panel.background=element_blank(),
        panel.border=element_blank(),
        panel.grid.major=element_blank(),
        panel.grid.minor=element_blank(),
        plot.background=element_blank()
       )
 
ggsave(filename = str_c("pie", ".png"), 
         plot = pie, 
       path = "outputs", 
       width = 8.5, 
       height = NA, 
       units = c("in", "cm", "mm", "px"), 
       dpi = 300, )

原因分析

  1. 参数错误导致渲染异常:ggsave中units参数同时传入多个值属于无效设置,会触发默认解析逻辑,间接导致尺寸或渲染精度异常。
  2. 极坐标下边框渲染冲突:geom_col设置了黑色边框,在极坐标转换后,中心区域的边框线条因渲染引擎精度问题出现叠加错位伪影;RStudio预览使用的渲染引擎与ggsave默认设备存在差异,因此预览无问题。
  3. 底层依赖库细微差异:即使软件版本一致,设备底层的图形渲染依赖(如libpng、Cairo)版本不同,也可能导致渲染结果出现差异。

解决方法

1. 修正ggsave参数错误

将units改为单一有效值,同时建议饼图设置宽高一致避免拉伸:

ggsave(filename = str_c("pie", ".png"), 
       plot = pie, 
       path = "outputs", 
       width = 8.5, 
       height = 8.5, 
       units = "in", 
       dpi = 300)

2. 移除或调整切片边框

伪影根源是切片边框在极坐标中心的冲突,可通过以下方式解决:

  • 直接移除边框:修改geom_col的color参数为NA
    geom_col(width = 1, color = NA)
    
  • 缩小边框宽度:使用linewidth(R 4.2+版本替代size)设置极小值
    geom_col(width = 1, color = 1, linewidth = 0.1)
    

3. 指定Cairo渲染引擎

调用Cairo设备提升PNG渲染稳定性,避免伪影:

ggsave(filename = str_c("pie", ".png"), 
       plot = pie, 
       path = "outputs", 
       width = 8.5, 
       height = 8.5, 
       units = "in", 
       dpi = 300,
       type = "cairo")

4. 优化绘图逻辑

改用geom_bar并调整极坐标的裁剪设置:

pie <-  df |>
  ggplot(mapping = aes(x ="", y = count, fill = impact)) +
  geom_bar(width = 1, color = NA, stat = "identity") +
  coord_polar("y", start=0, clip="off") + 
  theme(
    axis.line=element_blank(),
    axis.text.x=element_blank(),
    axis.text.y=element_blank(),
    axis.ticks=element_blank(),
    axis.title.x=element_blank(),
    axis.title.y=element_blank(),
    panel.background=element_blank(),
    panel.border=element_blank(),
    panel.grid.major=element_blank(),
    panel.grid.minor=element_blank(),
    plot.background=element_blank()
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 18:37:29