能否在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
相关产品推荐
相关产品推荐

