Очистите и сделайте читаемые гистограммы на ноутбуке Jupyter - PullRequest
1 голос
/ 31 октября 2019

Это может быть мелко, но как я могу сделать мой вывод гистограмм читабельным. Очевидно, мне нужно убрать знак + на высотах стержней, а также десятичные числа , чтобы я остался только с целыми числами. Вот мои данные:

# 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

Здесьэто мой код , я использую блокнот jupyter:

import numpy as np
import matplotlib.pyplot as plt
grouped = df.groupby('Hospital_name')

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

fig, axes = plt.subplots(nrows=nrows, ncols=ncols,figsize=(10,40),  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()

И вот мой ВЫХОД , выглядит так беспорядочно Bar graphs organized in one column

Кто-нибудь, кто поможет сделать мой вывод читабельным? Обратите внимание, что мне действительно нужно, чтобы число высот столбца было там, и окончательный результат будет сохранен в документе, возможно, в формате PDF. знак + и десятичные дроби могут быть удалены

1 Ответ

2 голосов
/ 31 октября 2019

Хотелось бы что-нибудь подобное для вас? Я знаю, что это много изменений, и это не совсем соответствует моему комментарию, но я так и нашел. Я также понимаю, что вам, возможно, придется немного подправить, чтобы учесть все дополнительные даты, которые у вас есть.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

data = {'Name': ['Jootrh Hospital', 'Jootrh Hospital',
                 'Embu Hospital', 'Embu Hospital',
                 'Bungoma Hospital', 'Bungoma Hospital',
                 'Keru Hospital', 'Keru Hospital'],
        'Date': ['18-Jul', '18-Aug', '18-Jul', '18-Aug', '18-Jul', '18-Aug',
                 '18-Jul', '18-Aug'],
        'Norm_Del': [452, 458, np.nan, 45, 498, 466, np.nan, 450],
        'Caesa_Sec': [67., 99., 13., 13., 60., 19., 73., np.nan],
        'Br_Del': [10., np.nan, 13., 137., 100., np.nan, np.nan, 197.],
        'Ass_VD': [np.nan, np.nan, 1., 37., 1., np.nan, 1., 37.]}
df = pd.DataFrame(data)
df2 = df.pivot_table(
    values=['Norm_Del', 'Caesa_Sec', 'Br_Del', 'Ass_VD'],
    index=['Name', 'Date'], fill_value=0)
df2.plot.bar(rot=45, figsize=(16, 8),
             color=['xkcd:cerulean', 'xkcd:avocado', 'xkcd:silver',
                    'xkcd:purple'])
i = 0
for unused, rows in df2.iterrows():
    print(rows['Norm_Del'])
    plt.annotate(rows['Ass_VD'], xy=(i - 0.19, rows['Ass_VD'] + 5), rotation=0,
                 color='xkcd:cerulean', fontweight='semibold', ha='center')
    plt.annotate(rows['Br_Del'], xy=(i - 0.06, rows['Br_Del'] + 5), rotation=0,
                 color='xkcd:avocado', fontweight='semibold', ha='center')
    plt.annotate(rows['Caesa_Sec'], xy=(i + 0.06, rows['Caesa_Sec'] + 5),
                 rotation=0, color='xkcd:silver', fontweight='semibold',
                 ha='center')
    plt.annotate(rows['Norm_Del'], xy=(i + 0.19, rows['Norm_Del'] + 5),
                 rotation=0, color='xkcd:purple', fontweight='semibold',
                 ha='center')
    i += 1
plt.savefig('so.png', bbox_inches='tight')
plt.show()

enter image description here

РЕДАКТИРОВАТЬ:

from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

data = {'Name': ['Jootrh Hospital', 'Jootrh Hospital',
                 'Embu Hospital', 'Embu Hospital',
                 'Bungoma Hospital', 'Bungoma Hospital',
                 'Keru Hospital', 'Keru Hospital'],
        'Date': ['18-Jul', '18-Aug', '18-Jul', '18-Aug', '18-Jul', '18-Aug',
                 '18-Jul', '18-Aug'],
        'Norm_Del': [452, 458, np.nan, 45, 498, 466, np.nan, 450],
        'Caesa_Sec': [67., 99., 13., 13., 60., 19., 73., np.nan],
        'Br_Del': [10., np.nan, 13., 137., 100., np.nan, np.nan, 197.],
        'Ass_VD': [np.nan, np.nan, 1., 37., 1., np.nan, 1., 37.]}
df = pd.DataFrame(data)
df2 = df.pivot_table(
    values=['Norm_Del', 'Caesa_Sec', 'Br_Del', 'Ass_VD'],
    index=['Name', 'Date'], fill_value=0)
names = np.unique([x[0] for x in df2.index.values])
dates = sorted(np.unique([x[1] for x in df2.index.values]),
               key=lambda day: datetime.strptime(day, '%d-%b'))
values = df2.columns.values
locLab = [-0.19, -0.06, 0.06, 0.19]
colors = ('xkcd:cerulean', 'xkcd:avocado', 'xkcd:silver', 'xkcd:purple')
fig, axs = plt.subplots(nrows=names.shape[0], figsize=(5 * len(dates),
                                                       4 * names.shape[0]))
i = 0
for name in names:
    df2.loc[name].reindex(dates).plot.bar(
        rot=0, ax=axs[i], title=name, color=colors)
    j = 0
    for date in dates:
        k = 0
        maxVal = np.amax(df2.loc[name].values)
        for value in values:
            val = df2.loc[name].loc[date][value]
            axs[i].annotate(val, xy=(j + locLab[k], val + maxVal / 100),
                            color=colors[k], fontweight='semibold',
                            ha='center')
            k += 1
        j += 1
    i += 1
plt.tight_layout()
plt.savefig('so.png', bbox_inches='tight')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...