You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 00:42:14