Изменение значений на оси графика matplotlib imshow()
Скажем, у меня есть некоторые входные данные:
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')
получение:
![enter image description here]()
Однако значения по оси x не соответствуют входным данным (то есть среднему значению 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:
![enter image description here]()
Любые идеи о том, как изменить значения осей, чтобы отражать входные данные, которые я использую?
Ответы
Ответ 1
Я попытался бы избежать изменения 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
![enter image description here]()
Ответ 2
У меня была похожая проблема, и 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