Как объединить линейный график с сгруппированной гистограммой с аннотацией - PullRequest
0 голосов
/ 08 января 2020

У меня очень большой файл Excel. Оттуда я повернул эти значения:

      Month       Task         baseline  Total Ownership
Team       Caterpillar Infosys
4      Jan        2273    7417     6000   9690     76.54%
3      Feb        2372    7222     6000   9594     75.28%
7      Mar        2624    8088     6000  10712     75.50%
0      Apr        2418    7993     6000  10411     76.77%
8      May        2891    7865     6000  10756     73.12%
6      Jun        1950    7182     6000   9132     78.65%
5      Jul        2027    7858     6000   9885     79.49%
1      Aug        1804    7259     6000   9063     80.09%
11     Sep        1708    7558     6000   9266     81.57%
10     Oct        2482    8601     6000  11083     77.61%
9      Nov        2137    8037     6000  10174     79.00%
2      Dec        1407    7168     6000   8575     83.59%

Я хочу сгруппированную гистограмму, имеющую месяцы по оси X и задачу по оси Y со значениями в верхней части каждого столбца и линейный график на вторичной оси Y собственности со значениями для каждого месяца.

Я написал этот код:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib.ticker as mtick
import seaborn as sns

df = pd.read_excel(r'C:\Users\patelmk1\Downloads\Automation\Incident Data _1231.xlsx')
pivot = df[df['Team'] != 'Autocloser'].pivot_table(index='Month', columns='Team',
                    aggfunc={'Task': pd.Series.count})
pivot.reset_index(inplace = True)
pivot['baseline'] = 6000
pivot['Total'] = pivot['Task']['Infosys'] + pivot['Task']['Caterpillar']
pivot['Ownership'] = pivot['Task']['Infosys'] / pivot['Total']
pivot['Ownership'] = pivot['Ownership'].map('{:.2%}'.format)
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", 
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
pivot['Month'] = pd.Categorical(pivot['Month'], categories=months, ordered=True)
pivot.sort_values('Month', inplace = True)
print(pivot)
x = np.arange(len(pivot['Month']))
width = 0.35  # the width of the bars

fig, ax = plt.subplots(figsize = (15,7))
ax.set_xticks(x)
ax.set_xticklabels(pivot['Month'])
ax2 = ax.twinx()
ax2.set_ylim(bottom = 0, top = 100)
ax2.yaxis.set_major_formatter(mtick.PercentFormatter())
ax2.plot(ax.get_xticks(), pivot['Ownership'], marker = 'o')
rects1 = ax.bar(x - width/2, pivot['Task']['Caterpillar'], width, label='Caterpillar')
rects2 = ax.bar(x + width/2, pivot['Task']['Infosys'], width, label='Infosys')

ax.legend()
ax.plot(pivot['baseline'])
ax.set_title("Overall")

def autolabel(rects):
    """Attach a text label above each bar in *rects*, displaying its height."""
    for rect in rects:
        height = rect.get_height()
        ax.annotate('{}'.format(height),
                    xy=(rect.get_x() + rect.get_width() / 2, height),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",
                    ha='center', va='bottom')


autolabel(rects1)
autolabel(rects2)

fig.tight_layout()
plt.savefig('fig.png')
plt.show()

и вот этот график я получаю: Graph

Вот что я хочу построить: Graph

1 Ответ

0 голосов
/ 08 января 2020

Ваша проблема в том, что значения в столбцах Ownership являются строками, и они должны быть числами, которые должны быть нанесены на график

удалить

pivot['Ownership'] = pivot['Task']['Infosys'] / pivot['Total']
pivot['Ownership'] = pivot['Ownership'].map('{:.2%}'.format)

и вместо этого написать

pivot['Ownership'] = 100 * pivot['Task']['Infosys'] / pivot['Total']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...