04 July 2020

Задача двух осей и четырех графиков - подписи с matplotlib

Ранее в посте Задача двух осей и четырех графиков - игра с matplotlib
я рассмотрел разбиени холста на области и рисование нескольких графиков.
Пойдем дальше - рассмотим всякие подписи и для начала подпишем оси и графики


Вот код:

# создаем верхнюю область
plt.subplot(211)

# рисуем модель и реальные данные
plt.plot( x,y , x,yr ,'go')

# Именуем ось абсцисс как Х, а ось ординат как Y
plt.xlabel('X')
plt.ylabel('Y')

# называем график First Subplot
plt.title('First Subplot')

# Аналогичным образом добавляем подписи во втрой график
plt.subplot(212)
plt.plot( x,y2 , x,yr2 ,'bo');
plt.xlabel('X')
plt.ylabel('Y2')
plt.title('Second Subplot')



Как можно видеть - подписи появились но название нижнего графика перекрывает подпись оси абсцисс верхнего, что не очень красиво.
Выход из этого положения - увеличить вертикальные отступы, т.е. добавить в конце кода вверху вот эту строчку:

# устанавливаем вертикальные отступы - Height Space
# значение по-умолчанию - 0.2
plt.subplots_adjust(hspace=0.70)



Теперь ничего не перехлестывается. Значение отступа легко подбирается эмпирически.

В случае использование subplots подписи ставятся несколько другими функциями, которые отличаются по факту префиксом set_ :

fig, ( ax_up, ax_btm) = plt.subplots(2,1)
ax_up.plot( x,y , x,yr ,'go')
ax_btm.plot( x,y2 , x,yr2 ,'bo')
 

ax_up.set_xlabel('X')

# при установке можно также указать цвет и размер шрифта
ax_up.set_ylabel('Y', color='red', fontsize=14)
ax_up.set_title('First Subplot', color='green', fontsize=14)

ax_btm.set_xlabel('X')
ax_btm.set_ylabel('Y2')
ax_btm.set_title('Second Subplot')

plt.subplots_adjust(hspace=0.70)



Установка цвета и размера также работает и при вызове subplot т.е. скажем так:

plt.ylabel('Y', color='red', fontsize=14)

Следующий шаг - это добавление легенд - т.е. название отдельных данных на графике. При этом придется расстаться с рисованием нескольких данных одним махом:

# вместо вот такого использования
plt.plot( x,y , x,yr ,'go')

# будет вот так
plt.plot( x,y )
plt.plot( x,yr ,'go')


Во втором варианте можно как раз добавить и подписи через label:

plt.subplot(211)

# ставим легенду для модельного графика
plt.plot( x,y, label='Model')
# ставим легенду для реального графика
plt.plot( x,yr ,'go', label='Real')

plt.xlabel('X')
plt.ylabel('Y', color='red', fontsize=14)
plt.title('First Subplot', color='green', fontsize=14)

# делаем легенды видимыми для верхнего графика
plt.legend().set_visible(True)

plt.subplot(212)
plt.plot( x,y2 , x,yr2 ,'bo');
plt.xlabel('X')
plt.ylabel('Y2')
plt.title('Second Subplot')
plt.subplots_adjust(hspace=0.70)


Замечание: если вызвать plt.legend().set_visible(True) и для нижнего графика то просто получим предупреждение "No handles with labels found to put in legend." поскольку подписи данных мы не задавали.

No comments:

Post a Comment