Скажем, у меня есть входные данные:
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')
получение:
Однако значения оси 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:
Любые идеи о том, как я могу изменить значения оси, чтобы отразить входные данные, которые я использую?
python
numpy
matplotlib
атомh33ls
источник
источник
pcolor
вместоimshow
указанного в этом ответе .Ответы:
Я бы попытался избежать изменения,
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
источник
interpolation="none"
здесь использовалось гораздо более точное представление реальных данных.У меня была аналогичная проблема, и 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
источник