ObsPy中如何将多个Stream绘制在同一图中并设置不同颜色
ObsPy多波形同图单独设置颜色方案
问题背景
需要将两个SAC文件读取后的波形绘制在同一张图中,初始实现代码如下:
st1=read('/path/1.SAC') st1+=read('/path/2.SAC') st1.plot()
上述代码可正常输出两个波形的绘制结果,但直接传入color参数时会同步修改所有波形颜色,无法为两个波形单独设置不同的显示颜色。
实现方法
ObsPy的plot方法直接传入全局color参数时会对Stream内所有Trace生效,要单独设置颜色可使用以下两种方案:
- 方案1:绘图前为每个Trace单独设置绘图属性
ObsPy支持在Trace的元数据中配置专属绘图参数,设置后绘图时会优先读取单迹配置,不受全局参数影响,示例代码:from obspy import read st1 = read('/path/1.SAC') st2 = read('/path/2.SAC') # 为第一个波形设置显示颜色为深红色 for tr in st1: tr.stats._format = {"color": "crimson"} # 为第二个波形设置显示颜色为深蓝色 for tr in st2: tr.stats._format = {"color": "navy"} # 合并流后直接绘图即可 st_all = st1 + st2 st_all.plot() - 方案2:获取matplotlib绘图对象后手动修改线条颜色
如果不想修改Trace的元数据,可以在绘图时关闭自动显示,拿到返回的matplotlib画布对象后逐线调整颜色,示例代码:from obspy import read st = read('/path/1.SAC') st += read('/path/2.SAC') # 绘图时设置show=False获取画布对象 fig = st.plot(show=False) # 按波形顺序定义颜色列表 wave_colors = ["crimson", "navy"] for ax in fig.axes: line_idx = 0 for line in ax.lines: # 跳过坐标轴参考线等非波形线条 if line.get_label() != "waveform": continue line.set_color(wave_colors[line_idx % len(wave_colors)]) line_idx += 1 # 调整完成后显示图像 fig.show()
提示:如果单个Stream内包含超过2个波形,只需要按Trace在Stream中的顺序扩展颜色列表即可,注意保证颜色顺序和波形顺序一一对应。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

