matplotlib如何实现x轴为datetime类型的曲线下渐变填充
解决方案
报错的核心原因是datetime类型无法直接参与乘法、减法等数值运算,我们可以通过将datetime转换为matplotlib内部的数值时间戳来解决,且不会影响x轴的日期格式显示。
修改步骤
- 新增matplotlib日期工具导入
import matplotlib.dates as mdates
- 修改
gradient_fill函数,统一处理datetime类型的x轴数据:
def gradient_fill(x, y, fill_color=None, ax=None, zfunc=None, **kwargs): # 保存原始datetime类型的x,用于绘制对齐的裁剪路径 orig_x = x # 将datetime转换为matplotlib内部数值时间戳,用于后续数值计算 x = mdates.date2num(x) if ax is None: ax = plt.gca() line, = ax.plot(orig_x, y, **kwargs) if fill_color is None: fill_color = line.get_color() zorder = line.get_zorder() alpha = line.get_alpha() alpha = 1.0 if alpha is None else alpha if zfunc is None: h, w = 100, 1 z = np.empty((h, w, 4), dtype=float) rgb = mcolors.colorConverter.to_rgb(fill_color) z[:,:,:3] = rgb z[:,:,-1] = np.linspace(0, alpha, h)[:,None] else: z = zfunc(x, y, fill_color=fill_color, alpha=alpha) xmin, xmax, ymin, ymax = x.min(), x.max(), y.min(), y.max() im = ax.imshow(z, aspect='auto', extent=[xmin, xmax, ymin, ymax], origin='lower', zorder=zorder) xy = np.column_stack([orig_x, y]) xy = np.vstack([[orig_x.min(), ymin], xy, [orig_x.max(), ymin], [orig_x.min(), ymin]]) clip_path = patches.Polygon(xy, facecolor='none', edgecolor='none', closed=True) ax.add_patch(clip_path) im.set_clip_path(clip_path) ax.autoscale(True) return line, im
实现原理
matplotlib内部会自动将datetime类型的轴数据转换为自0001-01-01以来的天数浮点数,mdates.date2num就是官方提供的转换接口。我们提前把x转成数值格式完成所有计算逻辑,而轴刻度会自动把内部数值映射回日期格式展示,既解决了运算报错问题,也不会改变最终的可视化效果。
内容的提问来源于stack exchange,提问作者Tom Kurushingal
相关产品推荐
相关产品推荐

