Python 基于轴而非数据在任意Matplotlib区域之间着色/填充

Python 基于轴而非数据在任意Matplotlib区域之间着色/填充,python,python-3.x,matplotlib,Python,Python 3.x,Matplotlib,是否可以不基于打印数据而是基于x轴范围在图表的任意区域之间填充 在下面的时间序列图中,我使用此fill_between调用对8pm和8am之间的区域进行着色: ax3.fill\u介于(d[0],0,ax3.get\u ylim()[1],其中=fill,facecolor=face\u color) 其中,填充是根据这些小时内记录的数据确定的: fill=[如果dt.time(8,0,0)

是否可以不基于打印数据而是基于x轴范围在图表的任意区域之间填充

在下面的时间序列图中,我使用此fill_between调用对8pm和8am之间的区域进行着色:

ax3.fill\u介于(d[0],0,ax3.get\u ylim()[1],其中=fill,facecolor=face\u color)
其中,
填充
是根据这些小时内记录的数据确定的:

fill=[如果dt.time(8,0,0)
这适用于前两个着色区域

问题是,有时,记录的数据在这些小时内不存在,因此阴影区域太小,不代表适当的小时数(参见图表中的第三个阴影区域)


我意识到我可以通过创建另一个具有适当x值范围的数据集来实现这一点,然后将其设置为不可见,但我想知道是否还有其他方法。

您可以构建一个包含
datetime
对象的数组,这些对象的范围与
x
数据的范围相同,并使用该数组填充
fill
数组

将numpy导入为np
# ...
fill=[如果dt.time(8,0,0)
完整示例:

导入matplotlib.pyplot作为plt
将日期时间导入为dt
将numpy作为np导入
plt.图(figsize=(12,3))
x=np.arange('2020-04-03T00:00Z','2020-04-05T00:30Z',np.random.randint(50,70),
dtype='datetime64[m]')
x=np.delete(x,np.s_uU4:10)
x=np.delete(x,np.s_uu2;[25:32])
y=np.sin(np.linspace(0,np.pi*2,len(x))*2+np.random.random(len(x))-0.5)
平面图(x,y)
dx=np.arange(x[0],x[-1]+60,60,dtype='datetime64[m]')。astype(dt.datetime)
fill=[如果dt.time(8,0,0)

好主意,但不幸的是,它不起作用:填充数组的尺寸必须与要打印的数据相同。创建长度和范围相同的datetime数组会导致数据x轴和填充x轴之间未对齐。我会使用更为复杂的填充数组创建机制,但收益递减定律会说这不值得努力。@DaveB我在回答中编辑了代码,以纠正您提出的问题。只要从中导出
dx
的数组从早到晚排序,代码现在就应该正常工作。不幸的是,问题仍然存在,但在您的示例中不存在,因为x和dx完全相等。因为我的数据是时间序列,所以它是非周期间隔的。您可以通过执行类似于
x=np.arange('2020-04-03T00:00Z','2020-04-05T00:30Z',np.random.randint(50,70),dtype='datetime64[m]')的操作进行复制非常好,我已经更新了我的示例以使用非周期数据,并且在其中放置了一些空白。如您所见,没有数据的区域正确着色。我希望这对你有帮助,但问题仍然存在。请比较x、dx和Fill,您将看到在某些情况下,如果Fill为true,x不在适当的小时之间。