Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 博克多重图表链接行为_Python_Bokeh - Fatal编程技术网

Python 博克多重图表链接行为

Python 博克多重图表链接行为,python,bokeh,Python,Bokeh,我有两张图表。当我放大顶部或底部图表时,x轴都会更新并显示相同的日期范围,这非常好。问题是两个图表上的y轴完全不同,所以当我放大顶部图表时,x轴和y轴的比例也相应地不同。在底部图表上,虽然x轴会相应缩放,但y轴不会。我不能使用y_范围=fig.y_范围,因为y范围非常不同 当两个图表的y轴范围不同时,放大顶部图表时,底部图表的y轴是否会相应缩放 更新-我所指的相应更新 假设我的x轴从2020年1月1日到2020年12月31日。现在,假设我使用内置工具在顶部图表上放大2020年7月的整个时间,底部

我有两张图表。当我放大顶部或底部图表时,x轴都会更新并显示相同的日期范围,这非常好。问题是两个图表上的y轴完全不同,所以当我放大顶部图表时,x轴和y轴的比例也相应地不同。在底部图表上,虽然x轴会相应缩放,但y轴不会。我不能使用y_范围=fig.y_范围,因为y范围非常不同

当两个图表的y轴范围不同时,放大顶部图表时,底部图表的y轴是否会相应缩放

更新-我所指的相应更新

假设我的x轴从2020年1月1日到2020年12月31日。现在,假设我使用内置工具在顶部图表上放大2020年7月的整个时间,底部图表的x轴将自动进行相应调整,即,现在在两个图表上放大整个7月的x轴。通过使用直线x_range=fig.x_range,这项工作非常出色。两个图表共享相同的x轴

但是它们的y轴不同,所以我不能使用y_范围=图y_范围

所以我想做的是当我放大顶部图表时,x轴和y轴都会自动重新缩放。我希望底部图表的y轴也能重新缩放(前面提到的x轴会自动执行此操作)

下面是我的代码

cds = ColumnDataSource(data=df)   

fig = figure(plot_width=W_PLOT, plot_height=H_PLOT, 
             tools=TOOLS,
             x_axis_type="datetime",
             title=name,
             toolbar_location='above')

# lets add a moving average
fig.line(x='time_stamp', y='ma_20', source=cds, legend_label='MA 20')

fig_ind = figure(plot_width=W_PLOT, plot_height=H_PLOT_IND,
                 tools=TOOLS,
                 x_axis_type="datetime",
                 x_range=fig.x_range)

fig_ind.line(x='time_stamp', y='ma_100', source=cds, legend_label='MA 100')

show(gridplot([[fig],[fig_ind]]))

下面介绍如何在公共X范围内使用
CustomJS
回调来实现这一点:

from bokeh.models.ranges import DataRange1d
from bokeh.layouts import column
from bokeh.models.sources import ColumnDataSource
from bokeh.models import CustomJS

import pandas as pd
import numpy as np


df = pd.DataFrame(
    {
        'fig1_y': np.linspace(0, 100, 100),
        'fig2_y': np.linspace(0, 1000, 100),
        'common_x': pd.date_range(
            start='2020-01-01',
            end='2021-01-01',
            periods=100
        )
    }
)

cds = ColumnDataSource(data=df)

common_x_range = DataRange1d(bounds='auto')

fig = figure(
    plot_width=500,
    plot_height=200,
    x_axis_type="datetime",
    x_range=common_x_range
)

fig.line(
    x='common_x',
    y='fig1_y',
    source=cds,
    legend_label='MA 20'
)

fig2 = figure(
    plot_width=500,
    plot_height=200,
    x_axis_type="datetime",
    x_range=common_x_range,
    y_range=DataRange1d(bounds='auto')
)

fig2.line(
    x='common_x',
    y='fig2_y',
    source=cds,
    legend_label='MA 100'
)


callback = CustomJS(
    args={
        'y_range': fig2.y_range,
        'source': cds
    }, code='''
    var x_data = source.data.common_x,
        fig2_y = source.data.fig2_y,
        start = cb_obj.start,
        end = cb_obj.end,
        min = Infinity,
        max = -Infinity;

    for (var i=0; i < x_data.length; ++i) {
        if (start <= x_data[i] && x_data[i] <= end) {
            max = Math.max(fig2_y[i], max);
            min = Math.min(fig2_y[i], min);
        }
    }
    
    y_range.start = min
    y_range.end = max
''')
common_x_range.js_on_change('start', callback)
common_x_range.js_on_change('end', callback)

show(column([fig,fig2]))
从bokeh.models.ranges导入数据范围1d
从bokeh.layouts导入列
从bokeh.models.sources导入ColumnDataSource
从bokeh.models导入CustomJS
作为pd进口熊猫
将numpy作为np导入
df=pd.DataFrame(
{
“fig1_y”:np.linspace(01100),
“图2_y”:np.linspace(0,1000,100),
“common_x”:pd.date_范围(
start='2020-01-01',
完='2021-01-01',
周期=100
)
}
)
cds=ColumnDataSource(数据=df)
公共范围=数据范围1d(界限='auto')
图(
绘图宽度=500,
绘图高度=200,
x_axis_type=“datetime”,
x_范围=普通x_范围
)
无花果线(
x='common_x',
y='fig1_'y',
来源=CD,
图例_标签='MA 20'
)
图2=图(
绘图宽度=500,
绘图高度=200,
x_axis_type=“datetime”,
x_范围=普通x_范围,
y_range=DataRange1d(bounds='auto')
)
图2.1线(
x='common_x',
y='fig2_'y',
来源=CD,
图例_标签='MA 100'
)
callback=CustomJS(
args={
“y_范围”:图2.y_范围,
“来源”:CD
},代码=“”
var x_data=source.data.common_x,
图2_y=source.data.fig2_y,
start=cb_obj.start,
结束=cb_对象结束,
最小值=无穷大,
max=-无穷大;
对于(变量i=0;i如果(开始这可以用一个Cuffjs回调来实现。你是什么意思?<代码>相应的<代码>这里?@ GSpPyChkA我已经更新了我的帖子,让我知道如果事情变得更清晰,非常感谢!欢迎你。谢谢你的赏赐。如果你觉得它正确地回答问题,考虑接受答案。抱歉,我想我是A。我已经接受了答案!现在就做