matplotlib отображает небольшое изображение без повторной выборки

Я пытаюсь построить небольшое изображение в python, используя matplotlib, и хотел бы, чтобы отображаемые оси имели ту же форму, что и массив 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() 

У меня была такая же проблема. Если interpolation='nearest' опция для imshow недостаточно хороша, хорошо, если ваша главная цель – увидеть сырые, немасштабированные, неинтерполированные, не figimage пиксели в 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 которые позволяют перемещать изображение вокруг фигуры, поэтому я предполагаю, что можно было бы маневрировать ими поверх некоторых осей, созданных другими средствами.

Вы можете использовать следующий фрагмент кода для преобразования массива в 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 и он пишет временное изображение. Таким образом, вы можете написать файл и загрузить его с помощью своего любимого средства просмотра изображений.

Я не уверен, что полностью понимаю ваш вопрос. Означает ли это, что вам нужна ось 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() 

Надеюсь, поможет

Если вы знаете собственное разрешение вашего изображения, вы можете установить аргумент dpi в соответствии с тем, что вы хотите в plt.figure(dpi=value) .

Вы можете найти дополнительную информацию об изменении размера изображения по этой ссылке .