<p>运行您的示例,缩放后matplotlib中的一切看起来都很好:无论分辨率如何,结果都是相同的,我看到每个轴单位有一个像素。
另外,尝试使用更小的数组时,pdf(或其他格式)也能很好地工作。</p>
<p>这是我的解释:<strong>当您设置图形dpi时,您设置的是整个图形的dpi(不仅仅是数据区域)。在我的系统中,这会导致绘图区域垂直占据整个图形的20%左右。如果设置300 dpi和10的高度,则垂直数据轴的总像素为300x10x0.2=600像素,这不足以表示1500个点,这就解释了为什么必须对输出重新采样。</strong>请注意,减小宽度有时会起到意外作用,因为它会更改数据绘图所占的图形部分。</p>
<p>然后,您必须增加dpi,并设置interpolation='none'(分辨率是否设置得完美并不重要,但只要足够接近就很重要)。
此外,还可以调整绘图位置和大小以占据图形的较大部分,但回到最佳分辨率设置,理想情况下,您希望在轴上有多个像素,即数据点的倍数,否则必须进行某种插值(请考虑如何在三个像素上绘制两个点,或viceversa)。</p>
<p>我不知道下面是不是最好的方法,matplotlib中可能有更合适的方法和属性,但是我会尝试这样的方法来计算最佳dpi:</p>
<pre><code>vsize=ax.get_position().size[1] #fraction of figure occupied by axes
axesdpi= int((Fig.get_size_inches()[1]*vsize)/R) #(or Yi*R according to what you want to do)
</code></pre>
<p>然后,您的代码(简化为第一个循环)变成:</p>
<pre><code>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 (1,):
print i
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')
vsize=ax.get_position().size[1] #fraction of figure occupied by axes
axesdpi= int((Fig.get_size_inches()[1]*vsize)/R) #(or Yi*R according to what you want to do)
Fig.savefig(Name+str(axesdpi)+'DPI.'+ImageFormat, format = ImageFormat, dpi = axesdpi)
#plt.close()
</code></pre>
<p>这对我来说是合理的。</p>