Python 具有可变大小的图形的图例位置

Python 具有可变大小的图形的图例位置,python,matplotlib,bar-chart,legend,subplot,Python,Matplotlib,Bar Chart,Legend,Subplot,我的绘图函数每年为不同大小的数据创建水平条。我必须更改每一组子图的图形大小。 我需要将我的两个图例放置在x轴标签下方每个图形的下中心。位置需要根据图形大小而变化,并保持一致。因此,对于所有制作的人物,图例将如下所示 查找我的数据帧的一个片段。我已经尽可能地简化了代码,我知道情节缺少了一些元素,但我只是想得到问题的答案,而不是在这里创建一个完美的情节。我知道我可能需要为锚点边界框创建一个变量,但我不知道如何创建。这是我的密码: def plot_bars(data,ax): "&

我的绘图函数每年为不同大小的数据创建水平条。我必须更改每一组子图的图形大小。 我需要将我的两个图例放置在x轴标签下方每个图形的下中心。位置需要根据图形大小而变化,并保持一致。因此,对于所有制作的人物,图例将如下所示

查找我的数据帧的一个片段。我已经尽可能地简化了代码,我知道情节缺少了一些元素,但我只是想得到问题的答案,而不是在这里创建一个完美的情节。我知道我可能需要为锚点边界框创建一个变量,但我不知道如何创建。这是我的密码:

def plot_bars(data,ax):
    """ Plots a single chart of work plan for a specific routeid
    data: dataframe with section length and year
    Returns: None"""
    ax.barh(df['year'], df['sec_len'] , left = df['sec_begin'])
    ax.set_yticklabels('')
def plot_fig(df):
    # Draw the plots
    ax_set = df[['routeid','num_bars']].drop_duplicates('routeid')
    route_set = ax_set['routeid'].values
    h_ratios = ax_set['num_bars'].values
    len_ratio = h_ratios.sum()/BARS_PER_PAGE # Global constant set to 40 based on experiencing 

    fig, axes = plt.subplots(len(route_set), 1, squeeze=False, sharex=True
                           , gridspec_kw={'height_ratios':h_ratios}
                           , figsize=(10.25,7.5*len_ratio))
    
    for i, r in enumerate(route_set):
            plot_bars(df[df['routeid']==r], axes[i,0])
    plt.xlabel('Section length')
    ## legends
    fig.legend(labels=['Legend2'], loc=8, bbox_to_anchor=(0.5, -0.45))

    fig.legend( labels=['Legend1'], loc = 8, bbox_to_anchor=(0.5, -0.3))

    ## Title
    fig.suptitle('title', fontsize=16, y=1)
    fig.subplots_adjust(hspace=0, top = 1-0.03/len_ratio)

for df in df_list:
    plot_fig(df)
问题是,当图形大小更改时,图例会移动,如下图所示:


我认为问题归结为相对于
xlabel
的正确相对位置,因此您需要使用xlabel的位置和轴的高度/宽度来计算
bbox\u to\u锚定。大概是这样的:


图(ax,ax1)=plt.子图(nrows=2,figsize=(5,4),gridspec_-kw={'height_-ratio':[4,1]})
ax.绘图(范围(10),范围(10),label=“myLabel”)
ax.set_xlabel(“xlabel”)
x、 y=ax.xaxis.get_label().get_position()#xlabel的位置
h、 w=ax.bbox.height,ax.bbox.width#轴的高度和宽度
支腿位置=[x+0/w,y-55/h]#需要根据您的需要进行调整
图图例(loc=“下中心”,bbox\U至\U锚定=支腿位置,bbox\U变换=ax.变速箱)
plt.show()

因为我需要两个图例,所以无法使用
ax.legend
。我相信轴心国只能有一个传说。我必须使用问题中所述的
fig.legend
,然后设置其
bbox\u transform=ax1.transAxes
。在那之后,它工作得很好@请编辑您的答案,以便我可以将其设置为正确答案。完成!如果要在
轴上使用多个图例,有一种方法:请参阅。但你的方式肯定会更好