matplotlib fill_between忽略非顺序数据的区域

时间:2017-10-31 20:15:43

标签: python matplotlib

我正在尝试填充y值为1的曲线下方的区域.x轴是具有非常规值的日期时间数组。如您所见,填充还包括没有x数据的区域。有没有办法告诉fill_between只填充“有效数据之间”?即在下图中,我希望“缺失”样本之间的区域为白色

tx = array(datetimes) # Array of irregular datetimes
ty = array([ones and zeros]) # Array of ones and zeros same size as tx

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(tx, ty, 'r.')
ax.fill_between(tx, 0, 1, where(ty==1))

Filled_values

1 个答案:

答案 0 :(得分:0)

这可能是你的目标。

filled areas

如果是,那么你可以使用矩形补丁。在这段代码中:

  • y是与您的'不规则'相对应的值列表。图案。
  • delta_float测量图表中与delta对应的水平距离,即刻度线之间的距离。
  • 请注意,修补程序的位置和大小分别基于日期和delta_float单位。
import datetime
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.dates import DayLocator, HourLocator, DateFormatter, drange, date2num
from numpy import arange

date1 = datetime.datetime(2000, 3, 2)
date2 = datetime.datetime(2000, 3, 6)
delta = datetime.timedelta(hours=6)
dates = drange(date1, date2, delta)

delta_float = (dates[-1]-dates[0])/len(dates)

y = [1,1,0,0,1,1,1,0,1,1,0,0,1,1,0,0]

fig, ax = plt.subplots()
ax.plot_date(dates, y, 'r.')
ax.add_patch(patches.Rectangle((dates[0], 0), delta_float, 1, color='grey'))
ax.add_patch(patches.Rectangle((dates[4], 0), 2*delta_float, 1, color='grey'))
ax.add_patch(patches.Rectangle((dates[8], 0), delta_float, 1, color='grey'))
ax.add_patch(patches.Rectangle((dates[12], 0), delta_float, 1, color='grey'))

ax.xaxis.set_major_locator(DayLocator())
ax.xaxis.set_minor_locator(HourLocator(arange(0, 25, 6)))
ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))

ax.fmt_xdata = DateFormatter('%Y-%m-%d %H:%M:%S')
fig.autofmt_xdate()

plt.show()