11 August 2020

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

Следующий этап этой задачи - создание второй оси. В matplotlib это достигается вызовом метода оси twinx, который тоже возвращает ось, только вторую. В простом случае ее можно и не запоминать - она становится текущей. Однако, чтобы ее получить в простом случае надо получить саму ось вызовом gca. При этом matplotlib не допускает интерактивности в части построения частей сложного графика.
В самом деле, давайте рассмотрим пример. Сначала создадим пару графиков - модельный и реальный - для одной оси:

plt.plot( x,y, label='Model', marker='x')
plt.plot( x,yr ,color = 'green', marker='D', linestyle='dashed', label='Real')
plt.xlabel('X')
plt.ylabel('Y', color='red', fontsize=14)
plt.title('First Subplot', color='green', fontsize=14)


Вот вывод такой части кода:

А теперь попробуем создать вторую ось в другой ячейке. Вот что мы увидим: 

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

plt.gca().twinx()
plt.plot( x,y2,color = 'black',label='Model Y2', marker='x')
plt.plot( x,yr2 ,color = 'red', marker='o', linestyle='dashed', label='Real Y2')
plt.ylabel('Y2')


то мы увидим только их - предыдущие данные для первой оси пропадут:

Таким образом, вызывать все надо в одной ячейке и только тогда мы получим то, что надо:

Теперь попробуем добавить легенды графиков - их придется делать два раза ибо каждый вызов будет относиться к отдельной оси. Ранее я использовал вызов plt.legend().set_visible(True) но оказывается можно и проще - просто plt.legend(). Вот что получим:

Как можно видеть, подписи легенд перехлестнулись с графиками. Ровно как и в случае с подписями областей тут, увы, придется править руками. В вызов plt.legend() можно поставить параметр loc и указать место расположения строкой:

Более детально о подобном форматировании можно почитать тут Customizing Plot Legends

Второй вариант создания второй оси - явный вызов методов у осей. В этом случае надо создать холст и ось вызовом subplots() не передавая ему никаких параметров для разбивки по областям.
Вызов twinx в этом случае производится непосредственно у оси, далее новая ось запоминается и вызов рисования идет ее методами:

fig, ax  = plt.subplots()
ax.plot( x,yr ,color = 'green', marker='D', linestyle='dashed', label='Real')
ax.plot( x,y, label='Model', marker='x')

ax.set_xlabel('X')
ax.set_ylabel('Y', color='red', fontsize=14)
ax.set_title('First Subplot', color='green', fontsize=14)
ax.legend(loc ='lower right')

ax2 = ax.twinx()
ax2.plot( x,y2,color = 'black',label='Model Y2', marker='x')
ax2.plot( x,yr2 ,color = 'red', marker='o', linestyle='dashed', label='Real Y2')
ax2.set_ylabel('Y2')
ax2.legend(loc = 'upper center')


Данный код рисует в точности такой же график с двумя осями, как и выше.

No comments:

Post a Comment