我正在尝试使用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()
答案 0 :(得分:5)
我自己也遇到过同样的问题。如果interpolation='nearest'
的{{1}}选项不够好,那么如果您的主要目标是在matplotlib中查看原始的,未缩放的,非插值的,未扫描的像素,那么您可以'哇imshow
恕我直言。演示:
figimage
当然这意味着放弃轴(或以某种方式自己绘制)。 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()
有一些选项让你可以围绕图形移动图像,所以我想可以在其他方法创建的某些轴上操纵它们。
答案 1 :(得分:3)
您可以使用以下代码段将数组转换为PIL(Python Imaging Library)。生成的图像将具有与输入数组相同的大小。它可以显示或保存为图像。
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
并且它会写一个临时图像。所以你也可以写一个文件并用你最喜欢的图像浏览器加载它。
答案 2 :(得分:1)
我不确定我完全理解你的问题。这是否意味着您希望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()
希望有所帮助
答案 3 :(得分:1)
如果您知道图像的原始分辨率,则可以在plt.figure(dpi=value)
中将dpi参数设置为您想要的值。
您可以在此link上找到有关调整图像大小的更多信息。