【问题标题】:Trouble adding the value ontop of each horizontal barchart [duplicate]在每个水平条形图的顶部添加值时遇到问题[重复]
【发布时间】:2019-07-03 08:40:37
【问题描述】:

我刚刚绘制了多个共享同一 y 轴的水平条形图。详细地说,我有 4 个数据框,每个数据框代表一个条形图。我使用这些数据框在左侧绘制了 2 个水平条形图,在右侧绘制了另外 2 个。但是,我不知道如何为每个水平条添加条形值,因为有 4 个数据框,每个包含不同的值。以下是我想要的输出、当前代码和图表

Edit* 仍在尝试获取水平条形图顶部的值。如果有人能伸出援助之手,那就太好了!

data1 = {
    'age': ['20-24 Years', '25-29 Years', '30-34 Years', '35-39 Years', 
'40-44 Years', '45-49 Years'],
    'single_value': [97, 75, 35, 19, 15, 13]
}

data2 = {
    'age': ['20-24 Years', '25-29 Years', '30-34 Years', '35-39 Years', 
'40-44 Years', '45-49 Years'],
    'single_value': [98, 79, 38, 16, 15, 13]
}

data3 = {
    'age': ['20-24 Years', '25-29 Years', '30-34 Years', '35-39 Years', 
'40-44 Years', '45-49 Years'],
    'single_value': [89, 52, 22, 16, 12, 13]
}

data4 = {
    'age': ['20-24 Years', '25-29 Years', '30-34 Years', '35-39 Years', 
'40-44 Years', '45-49 Years'],
    'single_value': [95, 64, 27, 18, 15, 13]
}

df_male_1 = pd.DataFrame(data1)
df_male_2 = pd.DataFrame(data2)
df_female_1 = pd.DataFrame(data3)
df_female_2 = pd.DataFrame(data4)

fig, axes = plt.subplots(ncols=2, sharey=True, figsize=(12,6))
axes[0].barh(df_male_1['age'], df_male_1['single_value'], align='edge', 
height=0.3, 
             color='lightskyblue', zorder=10)

axes[0].barh(df_male_2['age'], df_male_2['single_value'], align='edge', 
height=-0.3,
         color='royalblue', zorder=10)

axes[0].set(title='Age Group (Male)')

axes[1].barh(df_female_1['age'], df_female_1['single_value'], 
align='edge',height=0.3,color='navajowhite', zorder=10)

axes[1].barh(df_female_2['age'], df_female_2['single_value'], align='edge', 
height=-0.3,color='darkorange', zorder=10)

axes[1].set(title='Age Group (Female)')

axes[0].invert_xaxis()
axes[0].set(yticks=df_male_1['age'])
axes[0].yaxis.tick_right()

for ax in axes.flat:
    ax.margins(0.03)
    ax.grid(True)


fig.tight_layout()
fig.subplots_adjust(wspace=0.185, top=0.88)
plt.show()

【问题讨论】:

    标签: python pandas dataframe matplotlib bar-chart


    【解决方案1】:

    为了满足您的需求,我们将使用 matplotlib 的 ax.text 功能。我们将此方法称为ax.text(x, y, s),其中xy 是文本位置的坐标,s 是您要添加的文本。

    现在,df_male_1['single_values'] 中的值代表字符串的所需 x 位置和实际字符串值。在下面的代码中,这将表示为v

    此外,条形图的每个条形都有一个度量,因此枚举 (i) 处理条形的增量增加。

    最后,我们将文本移动到小节末尾一点 (v + 4),并同样将 y 坐标更改为我们想要的位置 (i + 0.1)。这一切都为我们提供了解决方案:

    for i, v in enumerate(df_male_1['single_value']):
        axes[0].text(v + 4, i + 0.1, str(v))
    for i, v in enumerate(df_male_2['single_value']):
        axes[0].text(v + 4, i - 0.2, str(v))
    
    for i, v in enumerate(df_female_1['single_value']):
        axes[1].text(v + 1, i + 0.1, str(v))
    for i, v in enumerate(df_female_2['single_value']):
        axes[1].text(v + 1, i - 0.2, str(v))
    

    除此之外,我还会稍微更改 x 限制以允许文本:

    axes[0].set_xlim([0, 105])
    axes[1].set_xlim([0, 105])
    

    将所有这些放在一起,您的最终工作示例如下:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    data1 = {
        'age': ['20-24 Years', '25-29 Years', '30-34 Years',
                '35-39 Years', '40-44 Years', '45-49 Years'],
        'single_value': [97, 75, 35, 19, 15, 13]
    }
    
    data2 = {
        'age': ['20-24 Years', '25-29 Years', '30-34 Years',
                '35-39 Years', '40-44 Years', '45-49 Years'],
        'single_value': [98, 79, 38, 16, 15, 13]
    }
    
    data3 = {
        'age': ['20-24 Years', '25-29 Years', '30-34 Years', 
                '35-39 Years', '40-44 Years', '45-49 Years'],
        'single_value': [89, 52, 22, 16, 12, 13]
    }
    
    data4 = {
        'age': ['20-24 Years', '25-29 Years', '30-34 Years',
                '35-39 Years', '40-44 Years', '45-49 Years'],
        'single_value': [95, 64, 27, 18, 15, 13]
    }
    
    df_male_1 = pd.DataFrame(data1)
    df_male_2 = pd.DataFrame(data2)
    df_female_1 = pd.DataFrame(data3)
    df_female_2 = pd.DataFrame(data4)
    
    fig, axes = plt.subplots(ncols=2, sharey=True, figsize=(12,6))
    axes[0].barh(df_male_1['age'], df_male_1['single_value'],
        align='edge', height=0.3, color='lightskyblue', zorder=10)
    axes[0].barh(df_male_2['age'], df_male_2['single_value'],
        align='edge', height=-0.3, color='royalblue', zorder=10)
    axes[0].set(title='Age Group (Male)')
    
    for i, v in enumerate(df_male_1['single_value']):
        axes[0].text(v + 4, i + 0.1, str(v))
    for i, v in enumerate(df_male_2['single_value']):
        axes[0].text(v + 4, i - 0.2, str(v))
    
    for i, v in enumerate(df_female_1['single_value']):
        axes[1].text(v + 1, i + 0.1, str(v))
    for i, v in enumerate(df_female_2['single_value']):
        axes[1].text(v + 1, i - 0.2, str(v))
    
    axes[0].set_xlim([0, 105])
    axes[1].set_xlim([0, 105])
    
    axes[1].barh(df_female_1['age'], df_female_1['single_value'], 
    align='edge',height=0.3,color='navajowhite', zorder=10)
    
    axes[1].barh(df_female_2['age'], df_female_2['single_value'], align='edge', 
    height=-0.3,color='darkorange', zorder=10)
    
    axes[1].set(title='Age Group (Female)')
    
    axes[0].invert_xaxis()
    axes[0].set(yticks=df_male_1['age'])
    axes[0].yaxis.tick_right()
    
    for ax in axes.flat:
        ax.margins(0.03)
        ax.grid(True)
    
    fig.tight_layout()
    fig.subplots_adjust(wspace=0.185, top=0.88)
    plt.show()
    

    制作剧情:

    【讨论】:

    • 您好,感谢您的帮助!您能否对您的代码进行简要说明,以便我理解?非常感谢!
    • 不客气。请参阅上面的编辑以获取更多说明。
    • 请查看重复的答案。最好使用annotate 及其textcoords 参数来避免标签偏移量取决于数据坐标。
    猜你喜欢
    • 2020-09-02
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多