如何在条形图的每个条形上方添加一个额外的数字

时间:2018-06-22 15:01:37

标签: pandas matplotlib visualization seaborn data-analysis

根据解释,为什么这个问题与此link不同 据我所知,此链接可以从图中获得高度,但就我而言,我在图中根本没有numpatients6month列,而只是在数据框上有此列。

所以我有一个条形图。每个x-axis都包含两个条,每个条从不同的数据帧中读取。

这是我正在绘制条形图的代码。

import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['axes.prop_cycle'] = ("cycler('color', 'rg')")
dffinal['CI-noCI']='Cognitive Impairement'
nocidffinal['CI-noCI']='Non Cognitive Impairement'
res=pd.concat([dffinal,nocidffinal])

sns.barplot(x='6month',y='final-formula',data=res,hue='CI-noCI').set_title(fs)
plt.xticks(fontsize=8, rotation=45)

plt.show()

如您所见,有two data frame。我用颜色dffinalgreen用颜色nocidffinal绘制了red

这是情节的结果:

enter image description here

更多说明: dffinal基于(6month, final-formula) nocidffinal也基于(6month,final-formula)

这是我的nocidffinal数据框:

          6month  final-formula  numPatients6month
137797.0       1       0.035934                974
267492.0       2       0.021705                645
269542.0       3       0.022107                769
271950.0       4       0.020000                650
276638.0       5       0.015588                834
187719.0       6       0.019461                668
218512.0       7       0.011407                789
199830.0       8       0.008863                677
269469.0       9       0.003807                788
293390.0      10       0.009669                724
254783.0      11       0.012195                738
300974.0      12       0.009695                722

dffinal

          6month  final-formula  numPatients6month
166047.0       1       0.077941                680
82972.0        2       0.057208                437
107227.0       3       0.057348                558
111330.0       4       0.048387                434
95591.0        5       0.033708                534
95809.0        6       0.036117                443
98662.0        7       0.035524                563
192668.0       8       0.029979                467
89460.0        9       0.009709                515
192585.0      10       0.021654                508
184325.0      11       0.017274                521
85068.0       12       0.010438                479

如您所见,此数据框中有numPatients6month列,我想在每个栏的顶部显示。 我确实NOT想要更改条形图并根据此列对其进行分组,而我只是想将此数字显示为每个条形图上方的用户额外信息。

感谢您的时间:)

1 个答案:

答案 0 :(得分:1)

如果将numPatients6month列以一个可迭代的方式排列,并按顺序显示在图表中,则使用其他stackoverflow答案(同样在文档here中),可以将文本放在正确地排在顶部。

我在下面使用了代码(改编自this答案)。它一排又一排地合并了多列(即将按图表顺序显示所有numPatients6month列)

vals = pd.concat([nocidffinal.numPatients6month, dffinal.numPatients6month], axis=1)
vals = vals.stack().reset_index(level=[0,1], drop=True)

enter image description here

这是我的完整代码

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['axes.prop_cycle'] = ("cycler('color', 'rg')")
dffinal['CI-noCI']='Cognitive Impairement'
nocidffinal['CI-noCI']='Non Cognitive Impairement'
res=pd.concat([dffinal,nocidffinal])

# Copied to clipboard from SO question above
# Comment out if you already have your dataframes
nocidffinal = pd.read_clipboard().reset_index() 
dffinal = pd.read_clipboard().reset_index() 

# This will merge columns in order of the chart
vals = pd.concat([nocidffinal.numPatients6month, dffinal.numPatients6month], axis=1)
vals = vals.stack().reset_index(level=[0,1], drop=True)

# Plot the chart
ax = sns.barplot(x='6month', y='final-formula', data=res, hue='CI-noCI')
_ = plt.xticks(fontsize=8, rotation=45)

# Add the values on top of each correct bar
for idx, p in enumerate(ax.patches):
    height = p.get_height()
    ax.text(p.get_x()+p.get_width()/2.,
            height + height*.01,
            vals[idx],
            ha="center")