Давайте сосредоточимся на средних осях.Вы можете использовать
y_pos = np.arange(len(sid))+1
plt.barh(y_pos, bel, height=0.9, align='edge', alpha=0.5)
plt.yticks(np.linspace(1, 4, 7))
plt.ylim(1, 4)
для получения желаемого результата.Обратите внимание, что добавление 1 к y_pos
делает y_pos
равным array([1, 2, 3])
, поскольку добавление константы в массив NumPy добавляет эту константу к каждому элементу в массиве:
In [11]: np.arange(len(sid))
Out[11]: array([0, 1, 2])
In [12]: np.arange(len(sid))+1
Out[12]: array([1, 2, 3])
Таким образом, plt.barh(y_pos, ..., align='edge')
мест нижний край столбцов в y-точках 1, 2, 3.
np.linspace(1, 4, 7)
создает 7 равных интервалов значений от 1 до 4:
In [13]: np.linspace(1, 4, 7)
Out[13]: array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. ])
plt.yticks(np.linspace(1, 4, 7))
говорит matplotlib пометить эти местоположения.
plt.ylim(1, 4)
устанавливает пределы по оси Y в диапазоне от 1 до 4.
На стилистической ноте вы можете рассмотреть возможность перехода на "объектно-ориентированный" стиль программирования matplotlib .Вместо вызова plt.subplot(1, 3, 2)
для активации второй из 3 осей, вы можете использовать
fig, ax = plt.subplots(ncols=3)
для генерации 3 осей.Это дает вам объект ax
, который представляет собой последовательность из 3 осей.
Преимущество кодирования таким образом заключается в том, что теперь у вас есть «физический» объект, на который вы можете отправлять команды.
Раньше, когда вы фокусировались на одной строке, такой как
plt.barh(y_pos, bel, height=0.9, align='edge', alpha=0.5)
, было не сразу понятно, по каким осям будет отображаться гистограмма.Теперь, используя объектно-ориентированный стиль кодирования matplotlib, эта команда будет
ax[1].barh(y_pos, bel, height=0.9, align='edge', alpha=0.5)
, поэтому вы сразу поймете, что на второй оси нарисованы.
Хотя это может быть немногоболее подробный (т.е. более типизированный), так как ваши программы становятся все сложнее, я думаю, вы обнаружите, что «объектно-ориентированный» стиль создает более четкий, более читаемый код.
Вот как будет выглядеть ваш код:
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(ncols=3)
sid = [1, 2, 3]
bel = [3, 4, 5]
y_pos = np.arange(len(sid)) + 1
ax[0].bar(y_pos, bel, width=0.9, align='edge', alpha=0.5)
ax[0].set_xticks(np.linspace(1, 4, 7))
ax[0].set_ylim(0, 5)
ax[1].barh(y_pos, bel, height=0.9, align='edge', alpha=0.5)
ax[1].set_yticks(np.linspace(1, 4, 7))
ax[1].set_xticks(np.arange(0,6,1))
ax[1].set_ylim(1, 4)
sid = []
bel = []
y_pos = np.arange(len(sid))
ax[2].barh(y_pos, bel, align='center', alpha=0.5)
ax[2].set_yticks([0.0,0.2,0.4,0.6,0.8,1.0])
ax[2].set_xticks([0.0,0.2,0.4,0.6,0.8,1.0])
ax[2].set_ylim(0, 1)
plt.tight_layout()
plt.show()
