【问题标题】:Add bar height value and Missing value on Bar graphs在条形图上添加条形高度值和缺失值
【发布时间】:2019-10-30 12:46:43
【问题描述】:

我确实喜欢在此条形图的输出上显示条形的高度数,并且还能够在条形图上包含缺失值以用零表示。这是我的数据集:

# intialise data of lists. 
data = {'Hospital_name':['Jootrh Hospital', 'Jootrh Hospital', 'Embu Hospital', 'Embu Hospital','Bungoma Hospital', 'Bungoma Hospital', 'Keru Hospital', 'Keru Hospital'], 
        'periodname':["18-Jul", "18-Aug", "18-Jul", "18-Aug","18-Jul", "18-Aug", "18-Jul", "18-Aug"], 'normal deliveries':[452, 458, "NAN", 45,498, 466, "NAN", 450],
       'caesarian sections':[67.0, 99.0, 13.0, 13.0,60.0, 19.0, 73.0, "NAN"], 'breach delivery':[10.0, "NAN", 13.0, 137.0,100.0, "NAN", "NAN" ,197.0],
       'assisted vd':["NAN", "NAN", 1.0, 37.0,1.0, "NAN", 1.0, 37.0]}


# Create DataFrame 
df = pd.DataFrame(data) 
df

这是我显示条形图的代码,但我确实想包含缺失值和条形高度值。

import numpy as np
import matplotlib.pyplot as plt

df.set_index('periodname', inplace=True)
grouped = df.groupby('Hospital_name')

ncols=2
nrows = int(np.ceil(grouped.ngroups/ncols))

fig, axes = plt.subplots(nrows=nrows, ncols=ncols,figsize=(20,50),  constrained_layout=True)

for (key, ax) in zip(grouped.groups.keys(), axes.flatten()):
    grouped.get_group(key).plot(kind='bar',ax=ax, title=key)

ax.legend()
plt.show()

如何能够在条形图上包含条形高度值以及由零表示的缺失值?

预期输出是这样的:

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    您可能可以在绘图之前将所有“NAN”值替换为 0。

    for (key, ax) in zip(grouped.groups.keys(), axes.flatten()):
        grouped.get_group(key).replace("NAN",0).plot(kind='bar',ax=ax, title=key)
    

    这将导致每个周期有 4 个柱。

    更新

    有关每个条形的高度/值,请参阅answer

    非常粗略且存在定位问题,这在您的代码中可能如下所示:

    fig, axes = plt.subplots(nrows=nrows, ncols=ncols,figsize=(20,50),  constrained_layout=True)
    
    x_offset = 0.02
    y_offset = 0.02
    
    for (key, ax) in zip(grouped.groups.keys(), axes.flatten()):
    
        temp = grouped.get_group(key).replace("NAN",0).plot(kind='bar',ax=ax, title=key)
        for bar in temp.patches:
            b = bar.get_bbox()
            val = "{:+.2f}".format(b.y1 + b.y0)        
            ax.annotate(val, ((b.x0 + b.x1)/2 + x_offset, b.y1 + y_offset))
    
    
    ax.legend()
    plt.show()
    

    【讨论】:

    • 和条高数?
    • 对不起,我错过了。也许可以调整so1so2 的答案。 matplotlib 主页还包括一个example
    • 我已经多次尝试了那个 matplotlib 示例,但现在我根本没有得到任何情节,如果你可以尝试在我共享的代码上复制它,我确实很喜欢,看来我在这方面遗漏了一些东西
    • 查看答案更新
    猜你喜欢
    • 1970-01-01
    • 2020-09-14
    • 2015-05-09
    • 1970-01-01
    • 2018-08-22
    • 2013-11-22
    相关资源
    最近更新 更多