matplotlib显示的不同于show()窗口中的保存

时间:2014-05-06 09:01:32

标签: python matplotlib

我使用matplotlib的imshow()绘制相当复杂的数据,所以我更愿意在保存之前首先目测检查它是否正常。所以我通常调用plt.show(),查看它是否正常,然后在show()窗口中使用GUI对话框手动保存它。一切都很好,但最近我开始变得很奇怪。当我保存图形时,我得到了一个非常错误的图片,尽管它在matplotlib的交互式窗口中看起来非常好。 如果我缩放到一个特定的位置,然后保存我看到的,我得到一个很好的数字。

所以,这是正确的(图片的一小部分,先用缩放保存):enter image description here

这一个是我保存全部后放大到图中大致相同的区域:approx

出于某种原因,第二个中的像素要大得多!这对我来说有点不好 - 正如你所看到的,它在那里失去了很多细节。

不幸的是,我的代码非常复杂,而且我无法使用一些随机生成的数据来重现它。在我开始分别绘制图片的两个三角形后出现此问题:我使用np.loadtxt()读取了两个大数据文件,获取np.triu(data1)np.tril(data2),屏蔽了零,NAs,-inf和+ inf,然后使用plt.imshow(data, interpolation='none', origin='lower', extent=extent)将它们绘制在相同的轴上。我做了很多其他不同的事情,以使它更好,但我想它并不重要,因为它之前的所有功能都像魅力一样。

请告诉我,如果您需要了解我的代码中的任何其他信息,那么这可能与此问题有关。

1 个答案:

答案 0 :(得分:1)

当您在png / jpg中保存图形时,您必须光栅化它,将其转换为有限的像素数。如果你想保持全分辨率,你有几个选择:

  • 使用非常高的dpi参数,例如900.保存绘图的速度很慢,许多图像查看器需要一些时间才能打开它,但信息就在那里,您可以随时裁剪它。
  • 保存图像数据,即用于制作图表的确切数字。每当您需要检查它时,在交互模式下将其加载到Matplotlib中,导航到您想要的角落并保存。
  • 使用SVG:它是矢量图形格式,因此您不限于像素。

以下是使用SVG的方法:

import matplotlib
matplotlib.use('SVG')
import matplotlib.pyplot as plt

# Generate the image
plt.imshow(image, interpolation='none')
plt.savefig('output_image')

编辑:

要保存真正的SVG,您需要从头开始使用SVG后端,遗憾的是,它与交互模式不兼容。一些后端,比如GTKCairo似乎允许两者,但结果仍然是光栅化的,而不是真正的SVG。

这可能是matplotlib中的一个错误,至少就我所知,它没有记录。