设置受约束的布局对我的代码不起作用

2024-09-27 00:23:30 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是mycode 如果使用图设置受约束布局(True),图例:lga显示错误 如果使用fig.tight_layout(),图例:lga显示正常 您能告诉我原因以及如何使用set_constrained_布局吗

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()


Tags: figredparamstablabelx1setaxis
1条回答
网友
1楼 · 发布于 2024-09-27 00:23:30

您需要使用GridSpec(或plt.subplots来组织布局,其作用相同)。matplotlib的未来版本将满足您的需求,但它目前的限制是,每个add_subplot命令都会添加一个新的gridspec,而且它们彼此都不了解,因此布局很糟糕

在您的示例中,您可能希望弄乱图例的位置。不太确定您使用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

相关问题 更多 >

    热门问题