我刚刚绘制了多个共享相同y轴的水平条形图。详细地说,我有4个数据框,每个数据框代表一个条形图。我使用这些数据框在左侧绘制了2个水平条形图,在右侧绘制了2个条形图。但是,我不知道如何为每个水平条添加条值,因为有4个数据框,每个数据框包含不同的值。下面是我想要的输出,当前代码和图形
编辑* 仍在尝试使水平条形图的顶部显示值。如果有人可以伸出援手,那就太好了!
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()
答案 0 :(得分:1)
要执行您想要的操作,我们将使用matplotlib的ax.text
功能。我们称此方法为ax.text(x, y, s)
,其中x
和y
是文本位置的坐标,而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()
制作情节: