我试图很好地将多维数组(见下文)绘制为平行水平条,其方式是True
时填充,False
时填充白色。 / p>
这是我的数据:
bar_1 bar_2 bar_3
0 True False False
1 True False False
2 True False True
3 False True False
4 False True False
5 False True False
6 False False False
7 False False False
8 False False False
9 False True False
10 False True False
11 False True False
12 False True False
13 False True False
14 False True False
15 False True False
16 True False False
17 True False False
18 True False True
19 False True False
20 False True False
21 False True False
22 True False True
23 False True False
24 False True False
25 False True False
以下是我希望如何展示它:
我正在通过matplotlib文档查找类似的内容,但没有运气。也许我错过了这种类型的绘图关键字。这种情节的名称是什么?是否可以使用matplotlib生成它?
答案 0 :(得分:0)
感谢ImportanceOfBeingErnest我想出了一个解决方案。我将使用broken_barh,它不是为此目的而设计的,但经过一些调整后,它可以用于此目的。 为简单起见,我只会显示一个函数,并将位置标记为红色高于0.5的位置。
index = np.linspace(start=-1, stop=5, num=100)
sin = np.sin(index**2)
df = pd.DataFrame({'sin': sin, 'filtered': sin > .5}, index=index)
可生产
注意我不会使用与图上相同的数据,因为这会占用太多空间
在下一步中,我计算我的函数超过阈值的标记点。只是想象它:
0 0 0 1 1 1 0 0 1 1 0 0 1 0 0
我计算移位值:
0 0 1 1 1 0 0 1 1 0 0 1 0 0 0
0 0 0 1 1 1 0 0 1 1 0 0 1 0 0 // The original values
0 0 0 0 1 1 1 0 0 1 1 0 0 1 0
我只保留原始数组True
和其他两个数组xor
(其中一个是True
或另一个但不是两者)的值:
0 0 0 1 0 1 0 0 1 1 0 0 0 0 0
注意,只有触及阈值的单个尖峰将为0。
这可以通过
轻松实现flags = df.filtered & (df.filtered.shift().fillna(False) ^ df.filtered.shift(-1).fillna(False))
现在我将标志点与索引相乘(不一定是整数索引)。
flag_values = flags * flags.index
0 0 0 3 0 5 0 0 8 9 0 0 0 0 0
并删除0值:
flag_values = flag_values[flag_values != 0]
[3, 5, 8, 9]
我仍然需要重塑它:
value_pairs = flag_values.values.reshape((-1, 2))
[[3, 5],
[8, 9]]
现在我需要从第二列中减去第一列:
value_pairs[:, 1] = value_pairs[:, 1] - value_pairs[:, 0]
我可以按如下方式绘制:
ax = df.sin.plot()
// The second parameter is the height of the bar, and its thickness.
ax.broken_barh(value_pairs, (0.49, 0.02,), facecolors='red')
这是结果