set_constrained_layout не работает с моим кодом - PullRequest
0 голосов
/ 29 мая 2020

Ниже приведен мой код при использовании fig.set_constrained_layout (True), легенда: ошибка отображения lga при использовании fig.tight_layout (), легенда: lga dispaly ok, не могли бы вы рассказать мне причину и как использовать set_constrained_layout

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)

ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,1,frameon=False,sharex=ax1)

ax3 = fig.add_subplot(2,2,2)
ax4 = fig.add_subplot(2,2,2,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 ,bbox_to_anchor=(2,1))

lgb = lg3 + lg4
labs = [l.get_label() for l in lgb]
ax3.legend(lgb, labs, loc=loc_val )

fig.set_constrained_layout(True)
#fig.tight_layout() 
plt.show()

1 Ответ

1 голос
/ 29 мая 2020

Вам нужно организовать макет, используя 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()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...