Змінити значення на осі графіка matplotlib imshow ()


89

Скажімо, у мене є деякі вхідні дані:

data = np.random.normal(loc=100,scale=10,size=(500,1,32))
hist = np.ones((32,20)) # initialise hist
for z in range(32):
    hist[z],edges = np.histogram(data[:,0,z],bins=np.arange(80,122,2))

Я можу побудувати це за допомогою imshow():

plt.imshow(hist,cmap='Reds')

отримання:

введіть тут опис зображення

Однак значення осі х не відповідають вхідним даним (тобто середнє значення 100, коливається від 80 до 122). Тому я хотів би змінити вісь x для відображення значень у edges.

Я намагався:

ax = plt.gca()
ax.set_xlabel([80,122]) # range of values in edges
...
# this shifts the plot so that nothing is visible

і

ax.set_xticklabels(edges)
...
# this labels the axis but does not centre around the mean:

введіть тут опис зображення

Будь-які ідеї щодо того, як я можу змінити значення осі, щоб відобразити вхідні дані, які я використовую?


Використовуйте pcolorзамість того, imshowяк зазначено у цій відповіді .
Нірмал,

Відповіді:


142

Я б намагався уникати зміни, xticklabelsякщо це можливо, інакше це може стати дуже заплутаним, якщо ви, наприклад, перепрограмуєте свою гістограму додатковими даними.

Визначити діапазон вашої сітки, мабуть, найкраще, і за допомогою imshowцього можна додати extentключове слово. Таким чином осі налаштовуються автоматично. Якщо ви хочете змінити мітки, я б використовував set_xticksїх, можливо, з яким-небудь форматором. Зміна ярликів безпосередньо повинна бути крайнім заходом.

fig, ax = plt.subplots(figsize=(6,6))

ax.imshow(hist, cmap=plt.cm.Reds, interpolation='none', extent=[80,120,32,0])
ax.set_aspect(2) # you may also use am.imshow(..., aspect="auto") to restore the aspect ratio

введіть тут опис зображення


18
Варто також зазначити, що interpolation="none"тут було використано набагато точніше подання реальних даних.
Підключено

4
Найкорисніша відповідь; Я використовував його для складання кольорового графіку функції двох змінних (а саме, сейсмічних даних). Я також додав опцію "аспект = 'авто'" в imshow (), щоб я міг "розтягувати і стискати" сейсмічний дисплей.
Курт Пік

10

У мене була подібна проблема, і Google надсилав мене до цього повідомлення. Моє рішення було дещо іншим і менш компактним, але, сподіваюся, це може бути комусь корисним.

Показ вашого зображення за допомогою matplotlib.pyplot.imshow - це, як правило, швидкий спосіб відображення 2D-даних. Однак це за замовчуванням позначає осі з підрахунком пікселів. Якщо 2D-дані, які ви складаєте, відповідають деякій однорідній сітці, визначеній масивами x та y, тоді ви можете використовувати matplotlib.pyplot.xticks та matplotlib.pyplot.yticks для позначення осей x та y, використовуючи значення в цих масивах. Вони зв’яжуть деякі мітки, що відповідають фактичним даним сітки, з підрахунком пікселів по осях. І робити це набагато швидше, ніж використовувати щось на зразок pcolor, наприклад.

Ось спроба зробити це з вашими даними:

import matplotlib.pyplot as plt

# ... define 2D array hist as you did

plt.imshow(hist, cmap='Reds')
x = np.arange(80,122,2) # the grid to which your data corresponds
nx = x.shape[0]
no_labels = 7 # how many labels to see on axis x
step_x = int(nx / (no_labels - 1)) # step between consecutive labels
x_positions = np.arange(0,nx,step_x) # pixel count at label position
x_labels = x[::step_x] # labels you want to see
plt.xticks(x_positions, x_labels)
# in principle you can do the same for y, but it is not necessary in your case
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.