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

能否在pandas-bokeh包中实现不同绘图的轴联动?

解决pandas-bokeh网格子图轴联动的方案

pandas-bokeh确实没有直接提供轴联动的配置参数,但它生成的图表本质都是Bokeh原生的Figure对象,所以可以通过操作底层Bokeh对象来实现多图轴同步缩放。下面是两种常用场景的具体实现:

场景1:手动构建网格布局后联动

先单独生成每个子图,再组合成网格,最后统一绑定轴的range对象:

import pandas as pd
import pandas_bokeh

# 生成测试数据
df = pd.DataFrame({
    "x": range(100),
    "y1": pd.Series(range(100)).cumsum(),
    "y2": pd.Series(range(100, 0, -1)).cumsum(),
    "y3": pd.Series(range(50)).repeat(2).cumsum()
})

# 生成子图时关闭自动显示,拿到Bokeh Figure对象
plot1 = df.plot_bokeh(kind="line", x="x", y="y1", show_figure=False)
plot2 = df.plot_bokeh(kind="line", x="x", y="y2", show_figure=False)
plot3 = df.plot_bokeh(kind="line", x="x", y="y3", show_figure=False)

# 构建网格布局
grid = pandas_bokeh.grid_plot([[plot1, plot2], [plot3, None]], show_figure=False)

# 共享X轴:将所有子图的X轴range与第一个子图绑定
shared_x_range = plot1.x_range
for row in grid.children:
    for plot in row:
        if plot is not None:
            plot.x_range = shared_x_range

# 显示最终网格
pandas_bokeh.show(grid)

场景2:用subplots参数生成多子图后联动

如果是通过subplots=True一次性生成多个子图,同样可以提取每个Figure对象并绑定轴:

import pandas as pd
import pandas_bokeh

df = pd.DataFrame({
    "x": range(100),
    "y1": pd.Series(range(100)).cumsum(),
    "y2": pd.Series(range(100, 0, -1)).cumsum(),
    "y3": pd.Series(range(50)).repeat(2).cumsum()
})

# 生成子图列表,关闭自动显示
figure_list = df.plot_bokeh(
    kind="line",
    x="x",
    y=["y1", "y2", "y3"],
    subplots=True,
    show_figure=False
)

# 绑定所有子图的X轴range
shared_x = figure_list[0].x_range
for fig in figure_list[1:]:
    fig.x_range = shared_x

# 组合成网格并显示
grid = pandas_bokeh.grid_plot([figure_list[:2], figure_list[2:]], show_figure=True)

核心原理

Bokeh的轴联动依赖共享Range对象——只要多个Figure的x_range(或y_range)指向同一个Range实例,这些图就会自动同步缩放、平移操作。pandas-bokeh只是封装了Bokeh的绘图逻辑,所以直接操作底层对象就能实现原生功能。

如果需要联动Y轴,只需要把代码中的x_range替换成y_range即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:54:14