R中ggplot导出PDF时geom_ribbon被细线连接的问题求助
解决ggplot2中geom_ribbon导出PDF出现跨对象细线的问题
以下是几个可行的解决思路:
1. 给分组数据添加分隔用的NA行
在每个独立的name-id分组末尾添加一行NA,明确让ggplot断开不同ribbon的绘制路径,避免PDF渲染时出现跨组连线:
library(dplyr) # 为每个分组添加分隔NA b_sep <- b %>% group_by(id, name) %>% mutate(row = row_number()) %>% bind_rows(b %>% group_by(id, name) %>% slice(1) %>% mutate(across(everything(), ~NA))) %>% arrange(id, name, row) %>% select(-row) # 使用处理后的数据绘图 ggplot(data = b_sep, aes(x = time, y = fitted)) + geom_ribbon(aes(ymin = cf_lwr, ymax = cf_upr, fill = "red", group = name), na.rm = TRUE) + facet_wrap(~id) -> test ggsave(test, filename = "Test1.pdf")
2. 使用Cairo PDF设备渲染
换用cairo_pdf设备导出PDF,其渲染引擎对矢量路径的处理更严谨,能避免这类伪连线问题:
ggsave(test, filename = "Test1.pdf", device = cairo_pdf)
3. 确保数据按分组和时间严格排序
如果数据存在乱序,可能导致ggplot绘制时出现异常路径,先对数据排序再绘图:
b_sorted <- b %>% arrange(id, name, time) ggplot(data = b_sorted, aes(x = time, y = fitted)) + geom_ribbon(aes(ymin = cf_lwr, ymax = cf_upr, fill = "red", group = name), na.rm = TRUE) + facet_wrap(~id)
问题原因说明
PNG是位图格式,渲染时会自动掩盖这类极细的跨组连线;而PDF是矢量格式,当不同分组的点在数据序列中连续排列时,部分PDF渲染引擎会错误地在组间绘制极细的连接线。通过添加NA分隔或更换渲染设备,可以从根源上解决这个问题。
内容的提问来源于stack exchange,提问作者Moritz Schwarz
相关产品推荐
相关产品推荐

