Следующий этап этой задачи - создание второй оси. В 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