我有一个中等大小的数组(例如1500x3000),因为它是一个图像,所以我想要按比例绘制。但是,纵向和横向尺度是非常不同的。为了简化,假设有一米/行和10 /列。该图应该产生一个图像c。 1500x30000。我使用kwarg的范围和aspect = 1来避免变形。通过使用绘图窗口(QT4)和imshow()或使用savefig(),我从未成功地按比例和全分辨率生成图像。使用matplotlib.pyplot,imshow()和savefig()以完整分辨率绘图?
我看过很多提出的解决方案,如情况here,here,或here和there或there表示,这是一个错误。我已经改变了我的matplotlibrc,并将其放在〜/ .config/matplotlib中,试图强制显示/ savefig选项,但无济于事。我也尝试了pcolormesh()但没有成功。我使用Ubuntu 14.04和QT4Agg的回购库中的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(),插值=“无”或“最近”或“双线”不出于某种原因更改分辨率,虽然我认为它应该至少在Qt4的窗口,如果我做节目()而不是savefig()。 请注意,无论您在plt.figure(dpi =)中设置了什么,分辨率都与保存的数字相同。
我没有想法,并在我对这个系统如何工作的理解的极限。任何帮助是非常受欢迎的。
在此先感谢。
是节约作为SVG的选择吗? 'plt.savefig(“test.svg”)' – Eric
我没有注意到在垂直分辨率方面节省了svg。 – Boorhin
我修改了代码,以便图像垂直地交替正值和负值。主要想法是,如果图像全部解析,我们应该能够区分蓝色和红色的横条纹 – Boorhin