基于分组值绘制条形图

2024-06-03 15:05:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想绘制条形图,显示条形图高度,通过在缺少值的地方显示零来包含图形上缺少的数据,并且图形应基于groupby选项单独显示。我有医院的数据,我想绘制每个医院的图表,然后将输出分面,以分面格式组织条形图。这是我的数据:

# 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

现在,我已按医院名称对数据进行分组,并使用时段名称作为索引,并绘制了输出,但问题是我无法获得条形高度编号,并且缺少的值(NAN)未显示在图形上。我还希望每个医院的条形图本身没有一个包含所有结果的单一条形图,最好有一个以刻面格式组织的每个医院的所有条形图的刻面网格。以下是我的代码:

#group data
df.set_index('periodname', inplace=True)
df = pd.DataFrame(df).groupby(['periodname','Hospital_name'])[['normal deliveries','caesarian sections','breach delivery','assisted vd']].agg({'normal deliveries': 'sum', 'caesarian sections': 'sum', 'breach delivery':'sum', 'assisted vd':'sum'})

df=df[['normal deliveries','caesarian sections','breach delivery','assisted vd']].apply(pd.to_numeric,errors='coerce')


df1 = df.pivot_table(index = 'periodname', values = ['normal deliveries','caesarian sections','breach delivery','assisted vd'], columns = 'Hospital_name').fillna(0)

import matplotlib.pyplot as plt
%matplotlib inline

for i,col in enumerate(df1.columns[1:]):
    bars= plt.bar([x+i*0.3 for x in list(df1.index)], df1[col], width = 0.3, label = col)

    for bar in bars:
        plt.gca().text(bar.get_x() + bar.get_width()/2, bar.get_height() - 5, str(int(bar.get_height())),ha='center', color='w', fontsize=11)

plt.xticks(list(df1.index), df1['periodname'])
plt.legend()

如何绘制每家医院期间名称的条形图


Tags: dfbarnandf1条形图normaldeliverydeliveries