Python matplotlib无需重新采样即可打印小图像

Python matplotlib无需重新采样即可打印小图像,python,matplotlib,Python,Matplotlib,我正在尝试使用matplotlib在python中绘制一个小图像,并希望显示的轴与从中生成的numpy数组具有相同的形状,即数据不应重新采样。换句话说,数组中的每个条目都应该对应于屏幕上的一个像素(或大约一个像素)。这看起来很琐碎,但即使在网上搜索了一段时间后,我似乎也无法让它工作: import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm X = np.random.rand(30,40) f

我正在尝试使用matplotlib在python中绘制一个小图像,并希望显示的轴与从中生成的numpy数组具有相同的形状,即数据不应重新采样。换句话说,数组中的每个条目都应该对应于屏幕上的一个像素(或大约一个像素)。这看起来很琐碎,但即使在网上搜索了一段时间后,我似乎也无法让它工作:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

X = np.random.rand(30,40)

fig = plt.figure()
fig.add_axes(aspect="equal",extent=[0, X.shape[1], 0, X.shape[0]])
ax = fig.gca()
ax.autoscale_view(True, False, False)
ax.imshow(X, cmap = cm.gray)

plt.show()

我不确定我是否完全理解你的问题。这是否意味着您希望x轴介于0和x.shape[1]之间,y轴介于0和x.shape[0]之间?在这种情况下,此代码应执行以下操作:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

X = np.random.rand(30,40)

fig = plt.figure()

plt.xlim(0, X.shape[1])
plt.ylim(0, X.shape[0])

ax = fig.gca()
ax.autoscale_view(True, False, False)
ax.imshow(X, cmap = cm.gray)

plt.show()

希望对您有所帮助

如果您知道图像的本机分辨率,您可以在
plt.figure(dpi=value)
中设置dpi参数


您可以在此找到有关调整图像大小的详细信息。

您可以使用以下代码段将数组转换为PIL()。结果图像的大小将与输入数组的大小相同。它可以显示或保存为图像

from PIL import Image
from numpy import linspace, array, fromfunction, sin, cos
from matplotlib import cm


# scale array between vmin and vmax and encode it to uint8 (256 values)
def scale(arr, vmin, vmax):
    return (255*(arr - vmin)/(vmax - vmin)).clip(0, 255).astype('uint8')

# convert a matplotlib colormap into a PIL palette
def getpalette(cmap):
    return (255.*array(map(lambda x: cmap(x)[0:3], linspace(0., 1.,256))).ravel()).astype('int')


# a sample array
data = fromfunction(lambda i,j: cos((i+j)/50)*sin(i/50.), (200, 300), dtype='float')

# convert the float array to a PIL image
im = Image.fromarray(scale(data, 0, 1))
im.putpalette(getpalette(cm.jet))
im.save('test.png') # or im.show()

唯一的问题是im.show()不是很好,因为它需要图像查看器
xv
,并且它会写入一个临时图像。因此,您也可以编写一个文件,并使用您最喜爱的图像查看器加载它。

我自己也遇到过同样的问题。如果
imshow
interpolation='nearest'
选项不够好,那么如果您的主要目标是在matplotlib中查看原始、未缩放、未插值、未弄脏的像素,那么您就无法击败
figimage
IMHO。演示:

import numpy as np
import numpy.random
import matplotlib.pyplot as plt

a=256*np.random.rand(64,64)

f0=plt.figure()
plt.imshow(a,cmap=plt.gray())
plt.suptitle("imshow")

f1=plt.figure()
plt.figimage(a,cmap=plt.gray())
plt.suptitle("figimage")

plt.show()

当然,这意味着放弃轴(或者自己画)。
figimage
有一些选项,可以让您在图形周围移动图像,因此我想可能可以在通过其他方式创建的一些轴上移动它们。

谢谢,如果我的问题让人困惑,我很抱歉。我试着在Matlab中做一些类似imshow的事情,其中图形中的轴与数组的大小相同,例如,屏幕上的每个像素对应于矩阵中的一个条目。上面对数组进行了重缩放和重采样以匹配图形大小。我刚刚在stackoverflow上找到了一篇smiliar帖子,他们使用了imshow的插值参数:ax.imshow(X,cmap=cm.gray,extent=(0,X.shape[1],0,X.shape[0]),interpolation='nearest'),这是链接,谢谢,使用最近邻插值很好,但我也希望轴要小,也就是说,它更能反映阵列的真实大小。目前,轴似乎仍在重新缩放以匹配图形大小。看起来您提供的代码达到了您想要的效果,矩形形状(40x30)保留在打印图像中,并且轴限制与图像形状匹配。你的问题中我遗漏了什么吗?对不起,我的措辞很混乱。我感兴趣的是matlab中的imshow功能,屏幕上的像素数与矩阵中的条目数匹配,即轴不会重新采样以匹配图形大小。你的意思是没有插值的图像吗?如果是这样,只需使用
matshow
更改代码
imshow
,或将
interpolation='nearest'
作为参数添加到imshow函数中即可。谢谢,这将停止平滑插值,但如何减小轴的大小,使图形反映图像的低分辨率?目前,它似乎仍然被重新缩放以匹配图形大小。如果有人想知道,我能够让figimage在没有任何绘图内容(Ipython笔记本中的图像除外)的情况下工作的唯一方法是在plt.show()之前添加一组空(“关闭”)轴,类似于此s/O post:。否则,它就不会有任何阴谋。