matplotlib中如何批量绘制axvspan垂直高亮区间
批量绘制刺激时段高亮的实现方法
ax.axvspan()本身不支持直接传入数组参数批量绘制,你可以直接使用matplotlib原生的ax.broken_barh()方法实现和ax.vlines()一致的数组传参批量绘制效果,不需要逐行手写区间,也不需要写显式for循环。
修改后的完整代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt df=pd.read_csv('file.csv') fig, ax = plt.subplots(figsize=(15,5)) df.plot(ax=ax) # 批量绘制刺激起始竖线 ax.vlines(np.arange(0, len(df), 30*50), 0, 1, transform=ax.get_xaxis_transform(), colors='r', alpha=0.5) # 一次性批量绘制所有刺激高亮区域 stim_start_points = np.arange(0, 15000, 3000) # 对应5次刺激的起始时间:0/3000/6000/9000/12000 stim_duration = 1500 # 生成格式为(起始x, 持续时长)的段数组 stim_intervals = np.column_stack([stim_start_points, np.full(len(stim_start_points), stim_duration)]) ax.broken_barh( stim_intervals, yrange=(0, 1), transform=ax.get_xaxis_transform(), color='red', alpha=0.4 ) # 修复原代码里未定义变量activity的笔误 ax.set_xlim([0, len(df)]) ax.set_ylabel('Normalised Intensity (a.u)') ax.set_xlabel('Time (s)') plt.show()
参数说明
stim_intervals为形状(n, 2)的numpy数组,每一行对应一个高亮段的起始横坐标和持续时长,完全可以通过numpy逻辑批量生成,后续调整刺激数量、间隔、时长时只需要修改生成数组的参数即可,不需要逐段改动绘图代码- 传入
transform=ax.get_xaxis_transform()搭配yrange=(0,1),可以保证高亮区域始终铺满整个y轴方向,不会随数据的y轴范围变化出现高度错位,效果和逐行调用axvspan完全一致 - 颜色、透明度等样式参数只需要配置一次,会自动应用到所有高亮段上
内容的提问来源于stack exchange,提问作者Ulises Rey
相关产品推荐
相关产品推荐

