Python 防止Matplotlib图例在垂直子批次上涂抹h填充?

Python 防止Matplotlib图例在垂直子批次上涂抹h填充?,python,python-3.x,matplotlib,legend,Python,Python 3.x,Matplotlib,Legend,我有一个脚本,其中我在5x1的网格中绘制了几个变量。我注意到,当我有使图例变短的数据时,子图本身具有可接受的高度和水平填充。当我有数据使我的图例变大(垂直)时,子图被挤压,在图之间留下额外的水平填充 有没有办法防止这种情况?要将图例指定与轴对象分开,并独立于图例间距绘制每个绘图 下面是一个最小的可复制示例,以说明我的意思: #/usr/bin/env蟒蛇3 从pathlib导入路径 作为pd进口熊猫 将numpy作为np导入 将matplotlib.pyplot作为plt导入 def绘图仪(df

我有一个脚本,其中我在5x1的网格中绘制了几个变量。我注意到,当我有使图例变短的数据时,子图本身具有可接受的高度和水平填充。当我有数据使我的图例变大(垂直)时,子图被挤压,在图之间留下额外的水平填充

有没有办法防止这种情况?要将图例指定与轴对象分开,并独立于图例间距绘制每个绘图

下面是一个最小的可复制示例,以说明我的意思:

#/usr/bin/env蟒蛇3
从pathlib导入路径
作为pd进口熊猫
将numpy作为np导入
将matplotlib.pyplot作为plt导入
def绘图仪(df、var_cols):
dfa=df.query(“已接受==‘已接受’”)
dfr=df.query(“已接受!=“已接受”)
colors={v:c代表v,zip中的c(['accepted','reject','rerun'],
['darkgreen'、'firebrick'、'steelblue'])]
图,轴=plt.子批次(nrows=len(var_cols),sharex=真)
对于变量,zip中的ax(变量列,轴):
对于dfr.groupby中的k,d('accepted'):
散度(d.迭代,d[var],label=k,alpha=0.8,c=d.接受图(颜色))
ax.plot(dfa.iteration,dfa[var],'-o',label='accepted',color=colors['accepted'])
#抓住第三个轴,因为我希望图例朝向中心
句柄,标签=轴[2]。获取\u图例\u句柄\u标签()
#对图例标签进行排序,将“已接受”置于顶部
标签,句柄=zip(*已排序(zip(标签,句柄),key=lambda t:t[0]))
轴[2]。图例(手柄、标签、标记比例=1.2,bbox_至_锚=(1,0.5))
图1紧_布局图()
def main():
状态={1:'接受',2:'拒绝',3:'重新运行'}
np.随机种子(666)
dat1=pd.DataFrame({
“迭代”:[0,1,2],
“已接受”:[“已接受”]*3,
“h_cap”:[10.1,6.5,12.2],
“h_stor”:[500410,0],
“h_mark”:[10,6,1],
‘出价’:[50010050],
“净现值”:[2.278,2.6,2.85]
})
dat2=pd.DataFrame({
“迭代”:范围(10),
'accepted':[states[num]表示np.random.randint(1,4,size=10)中的num,
“h_cap”:np.rand.rand(10),
“h_stor”:np.random.rand(10),
“h_标记”:np.random.rand(10),
“投标”:np.rand.rand(10),
“npv”:np.random.rand(10)
})
var_cols=['h_cap'、'h_stor'、'h_mark'、'bid'、'npv']
绘图仪(dat1,变量)
plt.savefig(路径('~/Desktop/nonsmushed.png').expanduser())
绘图仪(dat2,变量)
plt.savefig(路径('~/Desktop/smushed.png').expanduser())
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
nonsmushed.png

smushed.png

由于图例“属于”轴[2],
紧密布局()
调整间距,使相邻轴不覆盖图例

我认为最简单的解决方案是创建一个“图级”图例(
fig.legend()
),但问题是
tight_layout()
无法解释该图例,您必须手动调整右边距(如果需要,可能有一种方法可以自动计算,但这可能会变得混乱)

(...)
labels, handles = zip(*sorted(zip(labels, handles), key=lambda t: t[0]))
fig.legend(handles, labels, markerscale=1.2, bbox_to_anchor=(1, 0.5))
fig.tight_layout()
fig.subplots_adjust(right=0.75)  # adjust value as needed