Вам нужно организовать макет, используя gridspecs (или plt.subplots
, который делает то же самое). Будущие версии matplotlib будут делать то, что вы хотите, но его нынешнее ограничение состоит в том, что каждая команда add_subplot
добавляет новую сетку c, и они ничего не знают друг о друге, поэтому макет плохой.
В вашем примере вы захотите изменить размещение легенды. Не совсем уверен, что вы искали со значением bbox_to-anchor.
import numpy as np
import matplotlib.pyplot as plt
x1 = np.arange(10)
x2 = x1*10
y1 = x1*2
y2 = x1*100
fig = plt.figure()
fig.set_constrained_layout(True)
gs = fig.add_gridspec(2, 2)
ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 0],frameon=False,sharex=ax1)
ax3 = fig.add_subplot(gs[0, 1])
ax4 = fig.add_subplot(gs[0, 1],frameon=False,sharex=ax3)
lg1 = ax1.plot(x1,y1,label='ax1')
lg2 = ax2.plot(x2,y2,label='ax2',color='tab:red')
ax2.get_yaxis().set_ticks_position('right')
lg3 = ax3.plot(x1,y1,label='ax3')
lg4 = ax4.plot(x2,y2,label='ax4',color='tab:red')
ax4.get_yaxis().set_ticks_position('right')
ax1.tick_params(axis='x', labelcolor='tab:blue')
ax1.tick_params(axis='y', labelcolor='tab:red')
ax2.tick_params(axis='y', labelcolor='tab:red')
ax3.tick_params(axis='x', labelcolor='tab:blue')
ax3.tick_params(axis='y', labelcolor='tab:red')
ax4.tick_params(axis='y', labelcolor='tab:red')
loc_val = "upper right"
lga = lg1 + lg2
labs = [l.get_label() for l in lga]
ax1.legend(lga, labs, loc=loc_val)
lgb = lg3 + lg4
labs = [l.get_label() for l in lgb]
ax3.legend(lgb, labs, loc=loc_val )
plt.show()