Как я могу изменить оси X и Y в подсюжетах, используя Python? - PullRequest
0 голосов
/ 20 октября 2018

Итак, я пытаюсь использовать эти данные: [1,2,3], [3,4,5] для построения вертикальной гистограммы, горизонтальной гистограммы и пустого графика на одной диаграмме, которая будет выглядеть как изображение в этом примере:

enter image description here

но мой код пока немного отличается, как показано здесь.Посмотрите на оси X на столбчатой ​​диаграмме 1 и на оси Y на горизонтальной линейчатой ​​диаграмме 2. Я пытаюсь сделать так, чтобы столбчатая диаграмма 1 на оси X была похожа на ось Y на диаграмме.Теперь числа не в десятичных числах (например, 1.0,2.0), и для 1.5,2.5 и 3.5 не показаны никакие числа.(Я добился некоторого прогресса благодаря объяснениям unutbu):

еще одно обновленное изображение

Пожалуйста, посмотрите мой обновленный код ниже, я совершенно новичок в заговоре и все еще пытаюсь понятькак это работает:

import matplotlib.pyplot as plt
import numpy as np
plt.close()
fig, ax = plt.subplots(ncols=3)

sid = [1, 2, 3]
bel = [3, 4, 5]

y_pos = np.arange(len(sid))+1.5
ax[0].bar(y_pos, bel, align='center', alpha=0.5)
ax[0].set_xticks(y_pos, sid)
ax[0].set_xlim(1.0,4.0)
ax[0].set_ylim(0, 5)

y_pos = np.arange(len(sid)) + 1
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()

1 Ответ

0 голосов
/ 22 октября 2018

Давайте сосредоточимся на средних осях.Вы можете использовать

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()

enter image description here

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