<p>首先,当您保存为<code>.pdf</code>时,您隐式地使用pdf后端,即使您可能在选项中指定了其他后端。这意味着你的图像是以矢量格式保存的,因此dpi是毫无意义的。在任何分辨率下,如果我在一个像样的查看器中加载您的PDF(我使用了inkscape,其他的都可用),您可以清楚地看到条纹-我实际上发现,如果您将第二行设置为零,观察起来会更容易。生成的所有PDF都包含复制条纹的完整信息,因此几乎完全相同。当您指定<code>figsize=(45, 10)</code>时,所有生成的PDF都建议显示尺寸为45英寸x 10英寸。</p>
<p>如果我指定<code>png</code>作为图像类型,我会看到基于<code>dpi</code>参数的文件大小的差异,我认为这是您所期望的。如果你看100dpi图像,它有4500000个像素,200dpi图像有18000000个像素(4倍多),300dpi图像有40500000个像素(9倍多)。您将注意到4500000==1500 x 3000,即原始数组的每个成员一个像素。因此,更大的dpi设置并不能真正获得任何进一步的定义,相反,您的条纹宽度分别为2或3像素,而不是1像素。</p>
<p>我认为你要做的是有效地绘制每列10次,这样你得到的图像是1500 x 30000像素。为此,使用所有自己的代码,可以使用<a href="http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.repeat.html" rel="nofollow">^{<cd5>}</a>执行以下操作:</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, :] = 0 # make every other line plain white
Yi, Xi = 1, 10 # increment
DATA = np.repeat(DATA, Xi, axis=1)
DATA = np.repeat(DATA, Yi)
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()
</code></pre>
<p><strong><em>警告:</em></strong>这是一个内存密集型解决方案-可能有更好的方法。如果不需要<code>pdf</code>的矢量图形输出,可以将<code>ImageFormat</code>变量更改为<code>png</code></p>
<hr/>
<p>让我吃惊的是,你可能关心的另一件事是给图片适当的宽高比(即20倍于它的宽度)。你已经在做了。因此,如果你看<code>pdf</code>中每个像素的表示,它们是矩形的(是高度的10倍),而不是正方形的。</p>