如何移除geom_col柱状图轮廓并导出无轮廓PDF矢量图?
解决ggplot中geom_col导出PDF时无法移除柱状图轮廓的问题
我用geom_col绘制柱状图展示每个数据点,不想用geom_line()+geom_area()做平滑处理,但导出PDF矢量图时,柱状图的轮廓始终无法移除。尝试过传入col=NA或linewidth=0都没用,但导出PNG时即使不加这些参数,轮廓也会自动消失。
注:无法直接上传PDF,已将导出的PDF转为高清PNG展示。
原始代码
df <- data.frame( Position = rep(1:300, 3), Signal = sample(1:30, 900, replace=TRUE), Group = c(rep("A", 300), rep("B", 300), rep("C", 300)) ) plot <- ggplot() + geom_col(data = df, aes(x=Position, y=Signal, fill=Group), col=NA, size=0) + facet_grid(Group~.) ggsave("~/Desktop/plot.pdf", plot, device = "pdf") ggsave("~/Desktop/plot.png", plot, device = png, dpi=300) # 尝试过cairo渲染,结果类似 ggsave("~/Desktop/plot_cairo.pdf", plot, device = cairo_pdf)
问题更新
添加width=1参数后问题基本解决,但相邻柱状图y值不同时仍会出现细轮廓线,y值相同时则无轮廓。另外col=NULL和linewidth=0对PDF输出完全没有效果。
更新后代码
plot2 <- ggplot() + geom_col(data = df, aes(x=Position, y=Signal, fill=Group), width=1, col=NA, linewidth=0) + facet_grid(Group~.) ggsave("~/Desktop/plot2.pdf", plot2, device = "pdf") # 省略col和linewidth参数的版本 plot3 <- ggplot() + geom_col(data = df, aes(x=Position, y=Signal, fill=Group), width=1) + facet_grid(Group~.) ggsave("~/Desktop/plot3.pdf", plot3, device = "pdf")
对应效果描述
- PDF版本图:放大后可见明显柱状图轮廓
- PNG版本图:无轮廓干扰
- 更新后Plot2图:大部分轮廓消失,但y值不同的相邻柱子仍有细轮廓
- 更新后Plot3图:效果与Plot2一致
最终解决方案
这个问题本质是PDF矢量渲染的特性:当柱状图宽度小于1时,柱子间存在间隙,PDF会渲染出柱子的边缘轮廓;设置width=1让柱子紧密排列,消除间隙后大部分轮廓会消失。而相邻y值不同的柱子出现的细轮廓,是PDF渲染时两个相邻填充区域的边缘重叠或抗锯齿导致的视觉效果,可通过以下两种方案彻底解决:
方案1:用geom_tile()替代geom_col()
geom_tile()是纯粹的矩形填充,没有默认边框,更适合这种连续数据的展示,只需调整y轴映射参数:
plot_tile <- ggplot() + geom_tile(data = df, aes(x=Position, y=Signal/2, height=Signal, fill=Group)) + facet_grid(Group~.) ggsave("~/Desktop/plot_tile.pdf", plot_tile, device = "pdf")
方案2:强制边框颜色与填充色一致
如果坚持使用geom_col(),可以把边框颜色设置为和填充色完全相同,让轮廓视觉上与填充融为一体:
# 对应ggplot默认的分组填充色 fill_colors <- c("A" = "#F8766D", "B" = "#00BA38", "C" = "#619CFF") plot_fill_col <- ggplot() + geom_col(data = df, aes(x=Position, y=Signal, fill=Group, col=Group), width=1) + facet_grid(Group~.) + scale_color_manual(values = fill_colors) ggsave("~/Desktop/plot_fill_col.pdf", plot_fill_col, device = "pdf")
内容的提问来源于stack exchange,提问作者JVGen
相关产品推荐
相关产品推荐

