麻烦上每个水平条形图的顶部添加值[复制]

问题描述 投票:1回答:1

我刚刚绘制共享相同的Y轴的多个水平条形图。为了详细描述,我有4个dataframes,每个代表一个条形图。我用这些dataframes绘制左侧2个水平条形图和另外2个在右边。但是,我不知道如何为有4个dataframes,每个都包含不同的值,加上酒吧值为每个单杠。下面是我想要的输出,当前的代码和图形

编辑*仍试图获得在水平条形图顶部的值。这将是巨大的,如果有人能伸出援助之手!

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

Current Graph

python pandas dataframe matplotlib bar-chart
1个回答
1
投票

要做到你的愿望,我们将使用matplotlib的ax.text功能是什么。我们称这种方法为ax.text(x, y, s)其中xy是文本位置的坐标和s是你想添加的文字。

现在,在df_male_1['single_values']值代表你的字符串都需要的x位置和实际的字符串值。在低于该代码将被表示为v

此外,该barplot具有一个用于每个条的指标,因此枚举(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()

生产的情节:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.