将多维二进制数据绘制为水平条

时间:2017-09-07 20:13:06

标签: python pandas matplotlib

我试图很好地将多维数组(见下文)绘制为平行水平条,其方式是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

以下是我希望如何展示它:

enter image description here

我正在通过matplotlib文档查找类似的内容,但没有运气。也许我错过了这种类型的绘图关键字。这种情节的名称是什么?是否可以使用matplotlib生成它?

1 个答案:

答案 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)

可生产

Binary looks awful plotted as normal values

注意我不会使用与图上相同的数据,因为这会占用太多空间

在下一步中,我计算我的函数超过阈值的标记点。只是想象它:

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')

这是结果

enter image description here