Динамическая пороговая линия на гистограмме - PullRequest
0 голосов
/ 04 июля 2018

У меня есть гистограмма с накоплением, где я хочу добавить динамическую пороговую линию. Порог рассчитывается по простой формуле (90% каждого конкретного значения)

Графика прилагается. Зеленая линия - это то, что я ищу. Ждем любую идею, как подойти к этой проблеме.

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вы можете использовать функцию matplotlibs step для этого:

import pandas as pd
import matplotlib.pyplot as plt

предполагается, что ваши данные структурированы так:

df = pd.DataFrame({'In': [1, 1, 1, 2 , 0, 2, 0, 0], 'Out': [0, 0, 1, 0, 1, 0, 1, 1]}, index=['PD', 'PZV', 'PP', 'FW', 'BA', 'IA', 'EA', 'NA'])

     In  Out
PD    1    0
PZV   1    0
PP    1    1
FW    2    0
BA    0    1
IA    2    0
EA    0    1
NA    0    1

Тогда построение графиков будет

df.plot(kind='bar', stacked=True, rot=0, color=['gold', 'beige'])

и построение линии порога в 90% суммы будет

plt.step(df.index, df.sum(1) * .9, 'firebrick', where='mid', label = 'Ziel: 90%')

добавить легенду:

plt.legend()

ведет к:

enter image description here

0 голосов
/ 04 июля 2018

Вот что я придумал:

Идея заключалась в том, чтобы спроецировать непрерывный отрезок X с постоянным значением y с превышением 0,5 до и после:

import numpy as np
import matplotlib.pyplot as plt

groups = 9

X = list(range(1, groups))
y = [1, 1, 2, 2, 1, 2, 1, 1]

threshold_interval_x = np.arange(min(X) - 0.5, max(X) + 0.5, 0.01).tolist()

threshold_y = []
for y_elt in y:
    for i in range(0, int(len(threshold_interval_x) / (groups - 1))):
        threshold_y.append(y_elt * 0.9)

plt.bar(X, y, width=0.4, align='center', color='yellow')

plt.plot(threshold_interval_x, threshold_y, color='green')

labels_X = ['PD', 'PZV', 'PP', 'FW', 'BA', 'IA', 'EA', 'NA']
plt.xticks(X, labels_X, rotation='horizontal')

plt.show()

А вот и вывод:

Output

...