条形图中的动态阈值线

Dynamic treshold line in a bar chart

我有一个堆叠条形字符,我想在其中添加动态阈值线。阈值是通过一个简单的公式计算的(每个特定值的 90%)

附上图片。绿线是我要找的。期待任何解决这个问题的想法。

这是我想出的:

我们的想法是让一个连续的 Xs 段用一个常数 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()

这是输出:

您可以为此使用 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()

导致: