在使用ggplot的 ggsave导出饼图时出现的视觉伪影

前端开发 2026-07-09

我的搭档在用ggsave把 R的圆饼图保存下来时,遇到了一个我觉得很怪的问题——基本上,在圆饼图各扇区相交的中心处会多出一些微小的标记,好像扇形的圆心没有正确对齐。

pie chart via ggsave of df with point at chentre where segments dont align circled

数据是机密的,但基本结构如下(注,同样的问题也出现在不同的数据上)。

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, )

之所以怪异,原因有两点。首先,在RStudio中查看这张图时,并不存在这种伪影(不过,作为截图,像素看起来会更粗糙)

Screen grab of same pie chart from RStudio viewer, with no such artifact

更奇怪的是,当我在自己的机器上用完全相同的代码在RStudio中运行时,也没有这种伪影……

Same pie chart, generated with the same script on a different machine, showing no artifact.

我们俩都在用较旧的MacBook,因此都在运行R 4.2.3、RStudio 2022.07.02、Tidyverse 2.0.0。

有什么想法吗?

解决方案

以下的方法在Windows 11上的R 版本4.5.3(2026-03-11 ucrt)环境中奏效。

png(filename = str_c("pie", ".png"),
    width = 8.5,
    height = 7.64,
    units = "in",
    res = 300L
)
pie
dev.off()

从文档中的说明,help("ggsave"),这是我强调的要点。

device
要使用的设备。可以是一个设备函数(例如png),也可以是以下之一:"eps"、"ps"、"tex"(pictex)、"pdf"、"jpeg"、"tiff"、"png"、"bmp"、"svg" 或 "wmf"(仅Windows)。若 NULL(默认),设备会基于文件扩展名来猜测。

不要让 ggsave 根据文件扩展名来猜测设备,请显式使用设备 png(),问题就会消失。

ggsave(filename = str_c("pie", ".png"),
       plot = pie,
       path = "outputs",
       width = 8.5,
       height = NA,
       units = "in",
       dpi = 300,
       device = png
       )
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章