在 matplotlib 中创建颜色编码的水平条

Creating color-coded horizontal bars in matplotlib

我正在开发一个 QC 工具,用于根据多个标准“标记”时间序列中的可疑数据。好的数据将被标记为 1,坏的数据将被标记为 0。我想将包含 0 和 1 值的结果数组显示为颜色编码的水平条。

让我们考虑以下虚拟数组 myarray:

import numpy as np
import matplotlib.pyplot as plt
mysamples=np.arange(3600)
myarray = np.ones(3600)
myarray[300:500]=0
myarray[1300:1800]=0

我想出了以下解决方案来显示它:

解决方案使用bar

fig, axs = plt.subplots(2, gridspec_kw={'height_ratios': [5, 1]})
fig.suptitle('QC flag example 1')
axs[0].plot(mysamples,myarray)
axs[1].bar(mysamples[myarray==1], height=1, linewidth=0, color='green')
axs[1].bar(mysamples[myarray==0], height=1, linewidth=0, color='red')

解决方案使用scatter

fig, axs = plt.subplots(2, gridspec_kw={'height_ratios': [5, 1]})
fig.suptitle('QC flag example 2')
axs[0].plot(mysamples,myarray)
axs[1].scatter(mysamples[myarray==1],mysamples[myarray==1]*0 , marker='s', color='green')
axs[1].scatter(mysamples[myarray==0], mysamples[myarray==0]*0, marker='s', color='red')

我更喜欢选项 2,因为它允许我在彼此之上绘制多个 QC 轨道,但我仍然认为这是一种复杂的显示方式 myarray。例如,如果标记大小处理不当,最终可能会生成不连续的条形图。

是否有任何其他 matplotlib 函数可以创建这样的单杠?

注意:我知道 plotly 有很多选项,例如甘特图,但暂时我更愿意坚持使用 matplotlib。

我不确定这有多简单,但我使用水平条形图来处理它。创建一个相同长度的array1,并使用原始数组进行颜色判断。然后在循环过程中以索引为左边的位置堆叠。

fig, axs = plt.subplots(2, gridspec_kw={'height_ratios': [5, 1]})
fig.suptitle('QC flag example 1')

axs[0].plot(mysamples,myarray)
# axs[1].bar(mysamples[myarray==1], height=1, linewidth=0, color='green')
# axs[1].bar(mysamples[myarray==0], height=1, linewidth=0, color='red')
new_array = [1]*len(myarray)
colors = [('g' if i == 1 else 'r') for i in myarray]
for i,a in enumerate(new_array):
    axs[1].barh(y=0, width=a, height=0.5, left=i, color=colors[i])
x0,x1 = axs[0].get_xlim()
axs[1].set_xlim(x0, x1)

plt.show()