【发布时间】:2016-01-15 10:27:19
【问题描述】:
我有一个中等大小的数组(例如 1500x3000),我想按比例绘制它,因为它是一个图像。然而,垂直和水平的尺度是非常不同的。为简化起见,假设有 1 米/行和 10/列。然后,该图应生成一个图像,即 c。 1500x30000。我将 kwarg 范围用于尺度和 aspect = 1 以避免变形。 无论是使用绘图窗口 (QT4) 和 imshow() 还是使用 savefig(),我都无法成功地以全分辨率和比例生成图像。
我查看了许多建议的解决方案,如 here、here 或 here 和 there 或 there 中所示,以防这是一个错误。我已经更改了我的 matplotlibrc 并将其放在 ~/.config/matplotlib 中以尝试强制我的显示 / savefig 选项,但无济于事。我也尝试过 pcolormesh() 但没有成功。我使用来自 Ubuntu 14.04 和 QT4Agg 的 repo 的 python 2.7 和 matplotlib 1.3 作为后端。我也尝试过 TkAgg,但它很慢并且给出了相同的结果。我的印象是,在 x 轴上,分辨率是正确的,但在垂直方向上肯定是下采样的。这是一段应该模拟我的问题的代码。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
R, C = 1500, 3000
DATA = np.random.random((R, C))
DATA[::2, :] *= -1 # make every other line negative
Yi, Xi = 1, 10 # increment
CMP = 'seismic'
ImageFormat ='pdf'
Name = 'Image'
DataRange = (np.absolute(DATA)).max() # I want my data centred on 0
EXTENT = [0, Xi*C, 0 ,Yi*R]
NORM = matplotlib.colors.Normalize(vmin =-DataRange, vmax= DataRange, clip =True)
for i in range(1,4):
Fig=plt.figure(figsize=(45, 10), dpi = 100*i, tight_layout=True)
Fig.suptitle(Name+str(i)+'00DPI')
ax = Fig.add_subplot(1, 1, 1)
Plot = ax.imshow(DATA, cmap=plt.get_cmap(CMP), norm = NORM, extent = EXTENT, aspect = 1, interpolation='none')
ax.set_xlabel('metres')
ax.set_ylabel('metres')
Fig.savefig(Name+str(i)+'00DPI.'+ImageFormat, format = ImageFormat, dpi = Fig.dpi)
plt.close()
在 imshow() 中,interpolation = 'none' or 'nearest' or 'bilinear' 不会因为某种原因改变分辨率,尽管我认为如果我使用 show() 而不是至少在 Qt4 窗口中应该这样做保存图()。 请注意,无论您在 plt.figure(dpi=) 中设置什么,保存的图形中的分辨率都是相同的。
我一头雾水,对这个系统如何工作的理解也有限。非常欢迎任何帮助。
提前致谢。
【问题讨论】:
-
是否可以选择另存为 SVG?
plt.savefig("test.svg") -
我没有注意到在垂直分辨率方面保存为 svg 的改进。
-
我修改了代码,使图像垂直交替正值和负值。主要思想是,如果图像被完全解析,我们应该能够区分蓝色和红色水平条纹
-
您是否考虑过这可能是 .pdf 查看器的问题?当我运行您的示例时,使用 okular 打开它并放大,我看到了条纹。当我缩小时,它们仍然在那里。只有当 okular 决定对图像进行下采样以释放一些内存时,条纹才会消失。
标签: python matplotlib plot imshow