如何将美国国债比率图表与标普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
相关产品推荐
相关产品推荐

