Есть ли способ добавить вторую ось y в подзаговор matplotlib? - PullRequest
0 голосов
/ 30 мая 2019

(я думаю) Я знаю о функции twiny / x в matplotlib, но я действительно изо всех сил пытаюсь понять, как использовать эту функцию в контексте подпрограммы.У меня есть линейный график, на котором показаны данные об осадках:

enter image description here

, сгенерированный этим кодом:

fig,ax = plt.subplots(3, figsize=(10,15),sharey=True)

ax[0].plot(YEAR1['pcp_1D_tot'], label='RG')
ax[0].plot(YEAR1['ppt_1D'], label='TRMM')
ax[0].set_title('Year 1',x=0.1,y=0.9)

ax[1].plot(YEAR2['pcp_1D_tot'], label='RG')
ax[1].plot(YEAR2['ppt_1D'], label='TRMM')
ax[1].set_title('Year 2',x=0.1,y=0.9)
ax[1].set_ylabel('Rainfall total (mm/day)')

ax[2].plot(YEAR3['pcp_1D_tot'], label='RG')
ax[2].plot(YEAR3['ppt_1D'], label='TRMM')
ax[2].set_title('Year 3',x=0.1,y=0.9)
ax[2].set_xlabel('Date')

fig.legend(loc=(0.8,0.9))
fig.tight_layout()
plt.show()

Но у меня также естья хотел бы добавить данные о величине наводнения, которые находятся в категориях 1, 2 и 3, хранящиеся в столбце с именем, например,

YEAR1['Size'] 

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

Кто-нибудь может помочь?

** ########### ОБНОВЛЕНИЕ ############### **

Благодаря взносам, приведенным ниже, мне удалось сделатьследующее, на что я и рассчитывал:

enter image description here

Используя следующий код:

x = YEAR1m.index #### these are referring to other data that has been filtered
y = YEAR2m.index
z = YEAR3m.index

fig,ax = plt.subplots(3, figsize=(10,15),sharey=True)

ax[0].plot(YEAR1['pcp_1D_tot'], label='RG')
ax[0].plot(YEAR1['ppt_1D'], label='TRMM')
ax[0].set_title('Year 1',x=0.1,y=0.9)
ax0 = ax[0].twinx()
ax0.scatter(x, YEAR1m['Size'], marker='*', color='r',s=100)
ax0.set_ylim([0,3.2])
ax0.set_yticklabels(['0',' ','1',' ','2',' ','3'])


ax[1].plot(YEAR2['pcp_1D_tot'], label='RG')
ax[1].plot(YEAR2['ppt_1D'], label='TRMM')
ax[1].set_title('Year 2',x=0.1,y=0.9)
ax[1].set_ylabel('Rainfall total (mm/day)')
ax1 = ax[1].twinx()
ax1.scatter(y, YEAR2m['Size'], marker='*', color='r',s=100)
ax1.set_ylim([0,3.2])
ax1.set_yticklabels(['0',' ','1',' ','2',' ','3'])



ax[2].plot(YEAR3['pcp_1D_tot'], label='RG')
ax[2].plot(YEAR3['ppt_1D'], label='TRMM')
ax[2].set_title('Year 3',x=0.1,y=0.9)
ax[2].set_xlabel('Date')
ax2 = ax[2].twinx()
ax2.scatter(z, YEAR3m['Size'], marker='*', color='r',s=100)
ax2.set_ylim([0,3.2])
ax2.set_yticklabels(['0',' ','1',' ','2',' ','3'])


# fig.legend(loc=(0.8,0.9))
fig.tight_layout()
plt.show()

Ответы [ 2 ]

1 голос
/ 30 мая 2019

У меня нет ваших данных, давайте посмотрим, поняла ли я вашу проблему ...

Обычные вещи,

import matplotlib.pyplot as plt 
import numpy as np 

Сгенерируйте некоторые данные

x = np.linspace(0, 1.57, 21) 
y = np.sin(x) 
z = 4*np.random.random(21) 

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

fig, (ax0, ax1) = plt.subplots(2, 1) 
ax01 = ax0.twinx() 

Построить кривую (и), построить точки разброса, используя разные цвета (это не обрабатывается автоматически)

ax0.plot(x, y, color='blue') 
ax01.scatter(x, z, color='red') 

Это немного незапрошенный последний штрих ... (обратите внимание, это colors, а не color)

ax0.tick_params(axis='y',  colors='blue') 
ax01.tick_params(axis='y', colors='red')                                         

и наконец plt.show() дает нам

enter image description here

Я хотел бы добавить: спасибо Rutger Kassies за ваш точный ответ , где читатель моего ответа может найти дополнительные советы по настройке всех деталей двух вертикальных шипов.

1 голос
/ 30 мая 2019

При отсутствии данных я могу предоставить только предположение.Следующее должно работать.Вам нужно будет использовать отдельный объект подплота для создания вторичной оси Y, используя twinx

fig,ax = plt.subplots(3, figsize=(10,15),sharey=True)

ax[0].plot(YEAR1['pcp_1D_tot'], label='RG')
ax[0].plot(YEAR1['ppt_1D'], label='TRMM')
ax[0].set_title('Year 1',x=0.1,y=0.9)

ax0 = ax[0].twinx()
ax0.plot(YEAR1['Size'])


ax[1].plot(YEAR2['pcp_1D_tot'], label='RG')
ax[1].plot(YEAR2['ppt_1D'], label='TRMM')
ax[1].set_title('Year 2',x=0.1,y=0.9)
ax[1].set_ylabel('Rainfall total (mm/day)')

ax1 = ax[1].twinx()
ax1.plot(YEAR2['Size'])

ax[2].plot(YEAR3['pcp_1D_tot'], label='RG')
ax[2].plot(YEAR3['ppt_1D'], label='TRMM')
ax[2].set_title('Year 3',x=0.1,y=0.9)
ax[2].set_xlabel('Date')

ax2 = ax[2].twinx()
ax2.plot(YEAR3['Size'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...