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

如何将美国国债比率图表与标普500图表合并绘制?

合并Bokeh双时间序列图表的可行方案

一、双Y轴(主次轴)方案(推荐)

由于两个数据的数值范围、时间频率差异较大,双Y轴能在同一时间轴上直观对比两者的走势关联,是最贴合需求的实现方式。

具体实现步骤:

  • 创建基础figure,绑定共同的时间X轴,设置主Y轴对应标普500收盘价的显示范围。
  • 加载标普500日度数据,用line或蜡烛图组件绘制主图走势。
  • 为国债季度比率数据创建独立的ColumnDataSource,添加到图表的额外渲染器中,并指定次Y轴。
  • 配置主次Y轴的标签、颜色,明确区分两个数据系列。

代码示例:

from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, LinearAxis, Range1d
import pandas as pd
import numpy as np

# 模拟数据(实际替换为你的真实数据)
spx_data = pd.DataFrame({
    'date': pd.date_range(start='2020-01-01', end='2023-12-31', freq='D'),
    'close': np.random.randint(3000, 5000, size=1461)
})
bond_ratio_data = pd.DataFrame({
    'date': pd.date_range(start='2020-03-31', end='2023-12-31', freq='Q'),
    'ratio': np.random.uniform(0.2, 0.6, size=16)
})

# 创建主图,X轴为时间,主Y轴对应标普收盘价
p = figure(x_axis_type='datetime', title='标普500 vs 美国国债Bill/(Note+Bond)发行比率',
           y_axis_label='标普500收盘价', width=1000, height=600)

# 绘制标普500日度走势
spx_source = ColumnDataSource(spx_data)
p.line('date', 'close', source=spx_source, color='blue', legend_label='标普500收盘价')

# 添加次Y轴用于国债比率
p.extra_y_ranges['ratio_range'] = Range1d(start=0, end=1)
p.add_layout(LinearAxis(y_range_name='ratio_range', axis_label='Bill/(Note+Bond)比率'), 'right')

# 绘制国债季度比率(圆点+文本标签提升可读性)
bond_source = ColumnDataSource(bond_ratio_data)
p.circle('date', 'ratio', source=bond_source, color='red', size=10, legend_label='国债发行比率',
         y_range_name='ratio_range')
p.text('date', 'ratio', text='ratio', source=bond_source, color='red', y_range_name='ratio_range',
       text_align='center', text_baseline='bottom', text_font_size='8pt')

# 调整图例位置
p.legend.location = 'top_left'

show(p)

二、共享X轴的分面子图方案

如果担心双Y轴的数值差异造成视觉干扰,可以将两个图表垂直排列,共享同一时间X轴,实现上下联动对比。

实现要点:

  • 创建两个figure,设置x_range参数共享,确保时间轴同步缩放、平移。
  • 上方子图绘制标普500走势,下方子图绘制国债比率数据。
  • 用gridplot将两个子图组合成整体图表。

代码示例:

from bokeh.layouts import gridplot

# 创建两个共享X轴的子图
p1 = figure(x_axis_type='datetime', title='标普500收盘价', y_axis_label='收盘价', width=1000, height=400)
p1.line('date', 'close', source=spx_source, color='blue')

p2 = figure(x_axis_type='datetime', x_range=p1.x_range, title='美国国债发行比率', y_axis_label='比率', width=1000, height=200)
p2.vbar('date', top='ratio', source=bond_source, width=pd.Timedelta(days=20), color='red')

# 组合成网格布局
grid = gridplot([[p1], [p2]])
show(grid)

关键注意事项

  • 时间对齐:确保两个数据源的日期格式统一为datetime类型,季度数据的日期需对应到时间轴上的准确位置(如季度末最后一个交易日)。
  • 视觉区分:用不同的颜色、图形类型(线/点/柱状)区分两个数据系列,避免混淆。
  • 交互优化:可添加HoverTool工具提示,方便用户查看具体日期的双数据值。

内容的提问来源于stack exchange,提问作者dharmatech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:17:30