Matplotlib-如何绘制高分辨率图?


81

我已经使用matplotlib绘制了一些实验结果(在这里进行了讨论:循环遍历文件并作图。但是,通过单击图像右侧来保存图片会产生非常差的质量/低分辨率图像。

from glob import glob
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

# loop over all files in the current directory ending with .txt
for fname in glob("./*.txt"):
    # read file, skip header (1 line) and unpack into 3 variables
    WL, ABS, T = np.genfromtxt(fname, skip_header=1, unpack=True)

    # first plot
    plt.plot(WL, T, label='BN', color='blue')

    plt.xlabel('Wavelength (nm)')
    plt.xlim(200,1000)
    plt.ylim(0,100)
    plt.ylabel('Transmittance, %')
    mpl.rcParams.update({'font.size': 14})
    #plt.legend(loc='lower center')
    plt.title('')
    plt.show()
    plt.clf()


    # second plot
    plt.plot(WL, ABS, label='BN', color='red')
    plt.xlabel('Wavelength (nm)')
    plt.xlim(200,1000)
    plt.ylabel('Absorbance, A')
    mpl.rcParams.update({'font.size': 14})
    #plt.legend()
    plt.title('')
    plt.show()
    plt.clf()

我正在寻找的示例图示例图

Answers:


116

您可以savefig()用来导出到图像文件:

plt.savefig('filename.png')

另外,您可以dpi为某些标量值指定参数,例如:

plt.savefig('filename.png', dpi=300)

我不能这样指定文件名。该脚本将遍历“ glob(“ ./*。txt”)中的fname”中的文件。
esilik

随时随地调用文件
Ohad Eytan

它将覆盖数据并仅给出两张图片。是不是 我的目标是为每个文本文件获得两个图形。
esilik

所以,你可以做这样的事情plt.savefig(fname + 'Graph1.png')plt.savefig(fname + 'Graph2.png')
辖伊藤

大!第一个图形为plt.savefig(fname +'Graph1a.png',dpi = 600),第二个图形为plt.savefig(fname +'Graph1a.png',dpi = 600)解决了该问题。谢谢!
esilik

33

使用plt.figure(dpi=1200)所有之前plt.plot...和最终用途plt.savefig(...看:http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figurehttp://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig


@deepfriedcyanide在我的老问题上帮了我忙,说:“ savefig的文件名参数只是一个字符串,因此您可以执行类似的操作:plt.savefig('folder / file%d.png'%n)并加上一个在每个剧情之后。 “但我还不知道这个主意。我应该将这些代码放在脚本的什么位置以及如何放置?
esilik

1
太棒了,这对我有用!现在我的情节在4K XD中
Gonzalo Garcia

21

您可以将图形另存为svg以获得无损质量:

import matplotlib.pylab as plt

x = range(10)

plt.figure()
plt.plot(x,x)
plt.savefig("graph.svg")

3
你也可以保存为PDF格式plt.savefig("graph.pdf"),这也是无损
丹尼

3

对于将来尝试从matplotlib中保存高分辨率图像时发现此问题的未来读者,我已经尝试了上面和其他地方的一些答案,并将其总结在这里。

最佳结果plt.savefig('filename.pdf')

然后在命令行上将此pdf转换为png,以便可以在powerpoint中使用它:

pdftoppm -png -r 300 filename.pdf filename

不太成功的测试#1plt.savefig('filename.png', dpi=300)

这样确实可以将图像保存为比正常分辨率高一点的图像,但是对于发布或某些演示文稿来说不够高。当近距离观看时,使用高达2000的dpi值仍会产生模糊的图像。

不太成功的测试2plt.savefig('filename.pdf')

不能在Microsoft Office Professional Plus 2016中打开它(因此没有PowerPoint),与Google幻灯片一样。

不太成功的测试3plt.savefig('filename.svg')

与上述相同的问题,也无法在PowerPoint或Google幻灯片中打开。

不太成功的测试4plt.savefig('filename.pdf')

然后在命令行上转换为png:

convert -density 300 filename.pdf filename.png

但是当近距离观看时仍然太模糊。

不太成功的测试#5plt.savefig('filename.pdf')

并在GIMP中打开,并导出为高质量png(文件大小从〜100 KB增加到〜75 MB)

不太成功的测试6plt.savefig('filename.pdf')

然后在命令行上转换为jpeg:

pdfimages -j filename.pdf filename

即使更改了多个参数,这也不会产生任何错误,但不会在Ubuntu上产生输出。


2

要保存图形:

matplotlib.rcParams['savefig.dpi'] = 300

用于在使用时显示图形plt.show()

matplotlib.rcParams["figure.dpi"] = 100

只需将它们添加到顶部


0

for()循环的末尾,可以使用该savefig()函数代替plt.show()并设置图形的名称,dpi和格式。

例如1000 dpi和eps格式是相当不错的质量,如果您要将每张图片保存在名为'Sample1.eps','Sample2.eps'等的文件夹./中,则只需添加以下代码即可:

for fname in glob("./*.txt"):
    # Your previous code goes here
    [...]

    plt.savefig("./{}.eps".format(fname), bbox_inches='tight', format='eps', dpi=1000)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.