Поместите xticks и yticks в центр пикселей на графике imshow - PullRequest
0 голосов
/ 07 мая 2018

Я работаю с matplotlib для построения тепловой карты с некоторой информацией, и я хочу переместить xticks и yticks в центр. Я искал в stackoverflow предыдущие вопросы, но не смог найти ни одного подходящего для этой проблемы. Я прилагаю свой код и изображение, которое я получаю:

import matplotlib.pyplot as plt
from matplotlib import colors
import numpy as np

def plot():
    intensity= np.random.rand(10,10)

    matrix_intensity=np.matrix(intensity)
    max_intensity=matrix_intensity.max()
    min_intensity = matrix_intensity.min()
    for e in range(len(intensity)):
        for i in range(len(intensity[e])):
            intensity[e][i]=float(intensity[e][i])/float(max_intensity)
    np.random.seed(101)
    cmap = colors.ListedColormap(['white','khaki', 'goldenrod','yellowgreen','mediumseagreen','darkcyan','tomato','indianred' ,'sienna','maroon'])
    bounds = np.linspace(min_intensity/max_intensity,1,11).tolist()
    norm = colors.BoundaryNorm(bounds, cmap.N)

    img = plt.imshow(intensity, interpolation='none', origin='lower',extent=[0,len(intensity),0,len(intensity)],
                     cmap=cmap, norm=norm)

    cb=plt.colorbar(img, fraction=0.1,cmap=cmap, norm=norm, boundaries=bounds,format='%.2f') #'%.2f')
    cb.set_label(label='Ratio',fontsize=12,labelpad=10)
    plt.ylabel('Origin',fontsize=11)
    plt.xlabel('Destination',fontsize=11)
    plt.title('Best route:',fontsize=10)
    plt.suptitle('Best Solution:',fontsize=10)
    plt.xticks(range(1,len(intensity)+1))
    plt.yticks(range(1,len(intensity)+1))
    plt.savefig('images/hello.png')
    plt.show()

Дело в том, что я хотел бы, чтобы отметки x и y указывали на центр каждого квадрата, потому что в противном случае построение квадратов не имеет смысла. Кто-нибудь знает, как это исправить? Может быть, этот вопрос очевиден, но документацию по matplotlib для всех операторов иногда трудно понять.

Image of the problem

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Очевидное решение, вероятно, заключалось бы в использовании другого extent, а именно, чтобы изображение находилось в диапазоне от 0.5 до len(intensity)+0.5.

extent=[.5, len(intensity)+.5, .5, len(intensity)+.5]
img = plt.imshow(intensity, interpolation='none', origin='lower',extent=extent,
                     cmap=cmap, norm=norm)
0 голосов
/ 07 мая 2018

Вам нужно изменить способ установки xticks и yticks loc и labels ниже:

plt.xticks([x-0.5 for x in list(range(1,len(intensity)+1))], range(1,len(intensity)+1))
plt.yticks([x-0.5 for x in list(range(1,len(intensity)+1))], range(1,len(intensity)+1))

Выход:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...