【问题标题】:Saving images in Python at a very high quality以非常高的质量在 Python 中保存图像
【发布时间】:2013-04-17 12:01:04
【问题描述】:

如何以非常高的质量保存 Python 绘图?

也就是说,当我不断放大保存在 PDF 文件中的对象时,为什么没有任何模糊?

另外,保存它的最佳模式是什么?

png, eps?还是其他?我不能做pdf,因为有一个隐藏的数字发生在Latexmk 编译中。

【问题讨论】:

    标签: python graphics matplotlib save


    【解决方案1】:

    如果您正在使用Matplotlib 并试图在LaTeX 文档中获得好的数字,请另存为EPS。具体来说,在运行命令绘制图像后尝试这样的操作:

    plt.savefig('destination_path.eps', format='eps')
    

    我发现 EPS 文件效果最好,而 dpi 参数真正让它们在文档中看起来不错。

    要在保存之前指定图形的方向,只需在调用 plt.savefig 之前调用以下命令,但在创建绘图之后(假设您使用名称为 ax 的轴进行绘图):

    ax.view_init(elev=elevation_angle, azim=azimuthal_angle)
    

    其中elevation_angle 是一个数字(以度为单位),指定极角(从垂直 z 轴向下),azimuthal_angle 指定方位角(围绕 z 轴)。

    我发现通过首先绘制图像然后旋转它并观察角度的当前值出现在窗口底部,就在实际绘图下方,最容易确定这些值。请记住,默认情况下会显示 x、y、z 位置,但是当您开始单击+拖动+旋转图像时,它们会替换为两个角度。

    【讨论】:

    • @spencerlon2 如果我想在保存之前更改图形的方向怎么办?
    • 为什么需要DPI参数? eps 不是矢量格式吗?
    • 好点 - svg、pdf、eps 等矢量格式不需要 DPI
    • 如果您愿意,可以省略format='eps'。在这种情况下,格式是从文件名推断出来的。
    • @mkvoya 我认为dpi 越高,图像可以放大很多。
    【解决方案2】:

    只是添加我的结果,也使用 Matplotlib。

    .eps 使我的所有文字都加粗并删除了透明度。 .svg 为我提供了实际上看起来像我的图表的高分辨率图片。

    import matplotlib.pyplot as plt
    fig, ax = plt.subplots()
    # Do the plot code
    fig.savefig('myimage.svg', format='svg', dpi=1200)
    

    我使用 1200 dpi 是因为很多科学期刊都需要 1200 / 600 / 300 dpi 的图像,具体取决于图像的内容。转换为所需的 dpi 和GIMPInkscape 格式。

    显然 dpi 并不重要,因为 .svg 是矢量图形并且具有“无限分辨率”。

    【讨论】:

    • 当我们在图中某处使用imshow(..) 时,DPI 非常重要。这些位图在嵌入 SVG 时会被光栅化。使用默认 DPI,结果比我们在屏幕上看到的还要糟糕,绝对不适合发布。
    • 我也强烈推荐 Scour (github.com/scour-project/scour) 来减小 svg 的文件大小。在最激进的设置下,我可以将文件大小减少到原始文件的 50% - 如果我使用 .svgz 压缩格式,则为 5%。
    【解决方案3】:

    好的,我发现 spencerlyon2's answer 工作正常。但是,如果有人发现自己不知道如何处理那一行,我必须这样做:

    beingsaved = plt.figure()
    
    # Some scatter plots
    plt.scatter(X_1_x, X_1_y)
    plt.scatter(X_2_x, X_2_y)
    
    beingsaved.savefig('destination_path.eps', format='eps', dpi=1000)
    

    【讨论】:

    • dpi=1000 就是答案。
    【解决方案4】:

    您可以使用以下方法保存到 1920x1080(或 1080p)的图形:

    fig = plt.figure(figsize=(19.20,10.80))
    

    您也可以更高或更低。上述解决方案适用于打印,但现在您希望创建的图像转换为 PNG/JPG 或以宽屏格式显示。

    【讨论】:

    • 您可能应该补充一点,这是因为(通常)dpi 的默认值是 100,而 figsize 以英寸为单位。所以 19.2 英寸(每英寸 100 个点)在该维度上为您提供 1920 个点 =D
    【解决方案5】:

    如果您使用的是 seaborn 图,而不是 Matplotlib,您可以像这样保存 .png 图像:

    假设您有一个 matrix 对象(PandasNumPy),并且您想要获取热图:

    import seaborn as sb
    
    image = sb.heatmap(matrix)   # This gets you the heatmap
    image.figure.savefig("C:/Your/Path/ ... /your_image.png")   # This saves it
    

    此代码与最新版本的 Seaborn 兼容。 Stack Overflow 周围的其他代码仅适用于以前的版本。

    我喜欢的另一种方式是这样。我设置下一张图片的大小如下:

    plt.subplots(figsize=(15,15))
    

    然后我在控制台中绘制输出,我可以从中复制粘贴到我想要的位置。 (由于 Seaborn 是建立在 Matplotlib 之上的,所以不会有任何问题。)

    【讨论】:

      猜你喜欢
      • 2023-02-21
      • 2023-04-10
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多