Python 设置受约束的布局不';我不能写我的代码

Python 设置受约束的布局不';我不能写我的代码,python,numpy,matplotlib,Python,Numpy,Matplotlib,下面是mycode 如果使用图设置受约束布局(True),图例:lga显示错误 如果使用fig.tight_layout(),图例:lga显示正常 您能告诉我原因以及如何使用set_constrained_布局吗 将numpy导入为np 将matplotlib.pyplot作为plt导入 x1=np.arange(10) x2=x1*10 y1=x1*2 y2=x1*100 图=plt.图() 图:设置受约束的布局(真) ax1=图add_子批次(2,2,1) ax2=fig.add_子批次(2

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

将numpy导入为np
将matplotlib.pyplot作为plt导入
x1=np.arange(10)
x2=x1*10
y1=x1*2
y2=x1*100
图=plt.图()
图:设置受约束的布局(真)
ax1=图add_子批次(2,2,1)
ax2=fig.add_子批次(2,2,1,frameon=False,sharex=ax1)
ax3=图add_子批次(2,2,2)
ax4=图add_子批次(2,2,2,frameon=False,sharex=ax3)
lg1=ax1.绘图(x1,y1,label='ax1')
lg2=ax2.绘图(x2,y2,标签='ax2',颜色='tab:red')
ax2.get_yaxis().设置标记位置('right')
lg3=ax3.绘图(x1,y1,label='ax3')
lg4=ax4.绘图(x2,y2,标签='ax4',颜色='tab:red')
ax4.get_yaxis().设置标记位置('right')
ax1.勾选参数(axis='x',labelcolor='tab:blue')
ax1.勾选参数(轴为y,标签颜色为tab:red)
ax2.勾选参数(轴为y,标签颜色为tab:red)
ax3.勾选参数(axis='x',labelcolor='tab:blue')
ax3.勾选参数(轴为y,标签颜色为tab:red)
ax4.勾选参数(轴为y,标签颜色为tab:red)
loc_val=“右上角”
lga=lg1+lg2
labs=[l.获取lga中l的标签()
ax1.图例(lga、实验室、loc=loc_val、bbox_至_锚=(2,1))
lgb=lg3+lg4
labs=[l.get_label()表示lgb中的l]
ax3.图例(lgb,实验室,loc=loc_val)
图:设置受约束的布局(真)
#图1紧_布局图()
plt.show()

您需要使用GridSpec(或执行相同操作的
plt.subPlot
来组织布局)。matplotlib的未来版本将满足您的要求,但它目前的限制是每个
add\u子批
命令都会添加一个新的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()

嗨,Jody,非常感谢你的帮助,事实上matplotlib对我来说很难。你正在尝试做一些相对复杂的事情。如果以上回答了您的问题,请继续,并将其标记为已回答。很抱歉,回复太晚,现在我接管了有关matplotlib的代码,该代码已有十多年的历史,它基于matplotlib v1.x,它是一个背景,因此我无法使用“add_gridspec”,因此无论如何,谢谢