Рисование нескольких графиков с подзаголовком, когда ось y принимает два значения

#python #matplotlib #subplot

#python #matplotlib #подзаголовок

Вопрос:

Я хочу нарисовать 5 графиков с подзаголовками, где каждый график, ось y должна показывать 2 значения (несколько осей y). Я использую следующий код, но у меня возникают некоторые трудности. Я не знаю, как добавить заголовок для каждого графика, как добавить общую легенду для всех графиков, как принудительно увеличить ось x для каждого графика с шагом 1 и ось y с шагом 0.5.

 fig, ax1 = plt.subplots(3,2,figsize=(10,10))
ax2 = np.array([a.twinx() for a in ax1.ravel()]).reshape(ax1.shape)

x = np.arange(0,16)
curve1 = ax1[0,0].plot(x, optimal_policy[1,:-1,0], label='Optimal p', color='r',marker='o',linestyle='--')
curve2 = ax2[0,0].plot(x, optimal_policy[1,:-1,1], label='Optimal b', color='b',marker='v',linestyle='-.')
ax2[0,0].set_ylabel('b') 
ax1[0,0].set_ylabel('p') 
ax1[0,0].set_ylim(0,4)
ax2[0,0].set_ylim(0,4)

fig.legend(loc='upper right',bbox_to_anchor=(0.5, 0.5))

plt.title('Inventory =1')
plt.xlabel('Time')
ax1[0,0].set_xlabel('Time')
 

x и optimal_policy[1,:-1,0] являются векторами размером 16. Это всего лишь один из графиков, и можно копировать этот график для других подзаголовков.

Ответ №1:

Если я правильно понимаю, это решит вашу проблему. Вы можете настроить диапазон осей с min помощью и ваших max x,y массивов.

 from matplotlib import pyplot as plt
import numpy as np


x = np.arange(0,16)
y1 =  np.random.rand(16,1)*5
y2 =  np.random.rand(16,1)*4

fig, (ax1, ax2) = plt.subplots(2, 1, sharex=False, figsize=(10,10))

ax12 = ax1.twinx() 
l, = ax1.plot(x,y1,'g',label='Optimal p')
l2, = ax12.plot(x,y2,'b',label='Optimal b')


ax22 = ax2.twinx() 
l3, = ax2.plot(x,y1,'g',label='Optimal p')
l4, = ax22.plot(x,y2,'b',label='Optimal b')

ax1.title.set_text('First Plot')
ax2.title.set_text('Second Plot')

ax1.tick_params(axis='y', labelcolor="g")
ax12.tick_params(axis='y', labelcolor="b")
ax2.tick_params(axis='y', labelcolor="g")
ax22.tick_params(axis='y', labelcolor="b")    

ax1.set_xticks(np.arange(0,16,1))
ax2.set_xticks(np.arange(0,16,1))
ax1.set_yticks(np.arange(10) 0.5)
ax2.set_yticks(np.arange(10) 0.5)

plt.legend( handles=[l, l2, l3, l4],loc="upper left", bbox_to_anchor=[0, 1],
           ncol=2, shadow=True, title="Legend", fancybox=True)
 

Комментарии:

1. Большое вам спасибо. Но я хочу добавить две оси y. Левая ось y основана на p, а правая ось y основана на b. Я думаю, что этот код не показывает две оси.

2. Хорошо, без проблем, я отредактирую код. Я надеюсь, что это будет полезно 🙂