图片生成格式选择-矢量图还是位图

生成图片时矢量图和位图的选择。

选择生成矢量图还是位图,核心在于理解它们的本质区别以及你的图表类型。简单来说,这取决于你的图是由“数学公式”定义的,还是由“像素点阵”构成的。

🧬 矢量图 vs. 位图:本质区别

  • 矢量图 (Vector Graphics)
    • 构成:由点、线、曲线等几何形状的数学公式构成。
    • 特点无限放大不失真,文件体积通常较小(与图形复杂度有关,与尺寸无关)。
    • 常见格式:PDF, EPS, SVG。
    • 适用场景:由清晰线条、文字和色块组成的图表。
  • 位图 (Raster/Bitmap Graphics)
    • 构成:由一个个带有颜色信息的像素点(Pixel)组成的网格。
    • 特点放大后会变模糊/出现马赛克,文件体积与图像尺寸和分辨率(DPI)直接相关。
    • 常见格式:PNG, TIFF, JPEG(有损压缩,通常不建议)。
    • 适用场景:照片、显微镜图像或数据点极其密集的图表。

📊 如何选择:一张表看懂

图表类型 推荐格式 原因
柱状图、折线图、箱线图 矢量图 (PDF) 图形由简单的几何形状构成,矢量图能保证文字和线条在任何缩放比例下都清晰锐利。
通路图、示意图、流程图 矢量图 (PDF) 包含大量文本和连接线,矢量格式便于后期在 Illustrator 等软件中编辑和排版。
数据点较少的散点图 矢量图 (PDF) 如果散点数量在几千个以内,矢量图可以清晰展示每个点,且文件不大。
热图 (Heatmap) 矢量图 (PDF) 正如您的亲缘关系热图,它由大量不透明的色块组成,矢量格式非常高效且清晰。
照片、显微镜图、凝胶图 位图 (TIFF/PNG) 这些图像本身就是由像素构成的,强行转为矢量图只会让文件巨大且无意义。
数据点极多的散点图 位图 (TIFF/PNG) 如百万级数据点的曼哈顿图或单细胞 UMAP 图。用矢量图会导致内存溢出和文件过大,位图是更实际的选择。
需要复杂透明效果的图 位图 (PNG) 或 Cairo-PDF 原生 PDF 对透明度支持不佳。如果数据量不大可用 cairo_pdf,数据量大则直接输出为带透明通道的 PNG。

位图用 PNG 还是 TIFF?

AI 建议我只生成“母版”PNG,有需要再用外部工具转为 TIFF 格式(PNG可以无损转为无损格式的TIFF格式)。

💡 决策流程图

当你需要决定导出什么格式时,可以遵循以下思路:

  1. 你的图是照片或显微镜图像吗?
    • → 选择 位图 (TIFF/PNG)
    • → 进入下一步。
  2. 你的图包含成千上万个数据点吗?(例如曼哈顿图、UMAP图)
    • → 选择 位图 (TIFF/PNG)。这是为了避免内存溢出和生成无法打开的巨型文件。
    • → 进入下一步。
  3. 你的图主要由线条、文字、色块构成吗?(例如柱状图、折线图、热图)
    • → 优先选择 矢量图 (PDF)。它能保证最高的清晰度和可编辑性。

📌 总结

  • 追求清晰和可编辑性:只要数据量不是特别巨大,优先选择矢量图(PDF)。这是科研绘图的黄金标准。
  • 应对海量数据和真实图像:当图表本质是像素集合或数据点密集到矢量格式无法承受时,果断选择高分辨率的位图(TIFF/PNG)

举例:曼哈顿图为什么不能用pdf

1. 为什么不建议使用 cairo_pdf()

曼哈顿图的数据点极其密集,而 cairo_pdf() 的底层设计初衷是为了提供极高质量的图形渲染(如抗锯齿、透明度混合等)。在处理海量散点时,它会为每个数据点分配大量的内存来追踪其图形状态。当数据量达到百万级时,这种“过度设计”的渲染管线会导致内存占用呈指数级膨胀,极易引发 OOM(内存溢出)崩溃。

因此,总的来说,除了支持中文,以及支持透明度,其他情况都还应该使用 pdf()

2. 改为原生 pdf() 也不行

cairo_pdf() 改为原生 pdf() 设备,内存占用通常能降低 50% 到 80% 以上。原生 pdf() 设备的逻辑非常简单,它仅作为“翻译官”,将 R 的绘图指令直接转化为 PDF 矢量代码,省去了 Cairo 引擎复杂的中间状态管理和抗锯齿计算。虽然原生 pdf() 依然需要为每个点生成矢量对象,内存占用仍会随数据量线性增长,但它能为您争取到极大的内存缓冲空间。

但是除了内存,还有一个问题就是生成的 PDF 文件非常大(文件大小是 PNG 图片的几十倍,超过了 10 MB;而且打开非常慢,因为pdf 阅读器渲染时间很长,甚至直接卡死退出了)。

原因在于矢量图的本质:矢量格式(无论是 PDF 还是 SVG)必须将每一个数据点作为独立的数学对象保留在内存和最终的文件中。即使内存不崩溃,生成的 PDF 文件体积也会急剧膨胀(可能高达数百 MB 甚至数 GB),导致文件无法打开、排版软件卡死或打印设备无法解析。

解决方案:数据降采样(Downsampling)

对于曼哈顿图这种密集散点图,业界标准的最佳实践是数据降采样。人眼在屏幕上根本无法分辨几十万个重叠的点,因此保留全量数据在视觉上没有任何意义。

推荐操作: 在绘图前,保留所有显著位点(如 \(P < 5 \times 10^{-8}\)),对非显著位点进行随机抽样(例如只保留 10% 或固定数量如 5 万个点)。这不仅能将内存占用从几十 GB 瞬间降至几百 MB,还能大幅缩短绘图时间,且生成的图表视觉效果与全量数据几乎完全一致。

ggsave 保存不同格式图片代码

保存位图 tiff ,这里要加上压缩格式,要使用无损压缩(compression = "lzw" 其实是 底层画图函数tiff() 的参数)。

1
ggsave(file = "figure1.tiff", plot, dpi = 600, compression = "lzw")

保存位图 png

1
ggsave(file = "figure1.png", plot, dpi = 600)

保存矢量图pdf

1
ggsave(file = "figure1.pdf", plot, dpi = 600)

保存矢量图pdf (Cairo-PDF)

1
ggsave(file = "figure1.pdf", plot, dpi = 600, device = cairo_pdf)

其他基本用不到了。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2019-2026 Vincere Zhou
  • 访问人数: | 浏览次数:

请我喝杯茶吧~

支付宝
微信