Python 具有3个y轴的Bokeh服务器不';t绘图,但对2个y轴绘图。为什么?

Python 具有3个y轴的Bokeh服务器不';t绘图,但对2个y轴绘图。为什么?,python,plot,bokeh,multiple-axes,Python,Plot,Bokeh,Multiple Axes,我的目标是在多个y轴(不同范围)上绘制实时数据。以下代码使用2个y轴工作,但当我添加第3个y轴时,浏览器为空。早期使用4个y轴的基本bokeh绘图工作正常,但此服务器版本不工作。我不知道我犯了什么错误,请指导我 以下代码绘制2个临时点,然后绘制第3个永久点。使用ColumnDataSource中的“补丁”和“流”来实现这一点 from bokeh.io import curdoc from bokeh.models import ColumnDataSource from bokeh.plott

我的目标是在多个y轴(不同范围)上绘制实时数据。以下代码使用2个y轴工作,但当我添加第3个y轴时,浏览器为空。早期使用4个y轴的基本bokeh绘图工作正常,但此服务器版本不工作。我不知道我犯了什么错误,请指导我

以下代码绘制2个临时点,然后绘制第3个永久点。使用ColumnDataSource中的“补丁”和“流”来实现这一点

from bokeh.io import curdoc
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.models import LinearAxis, Range1d
import numpy as np

def plotcharts(source,x,a,b,c):
    fig=figure(y_range=(0, 500))
    fig.circle(source=source, x=x,y=a,size=12,color='red')

    fig.extra_y_ranges = {"foo1": Range1d(start=0, end=50)}
    fig.circle(source=source,x=x, y=b, size=12, color="blue", 
    y_range_name="foo1")
    fig.add_layout(LinearAxis(y_range_name="foo1"), 'left')

    # configure 3rd axis
    fig.extra_y_ranges = {"foo2": Range1d(start=0, end=25)}
    fig.circle(source=source, x=x, y=c, color="magenta", 
    y_range_name="foo2")
    fig.add_layout(LinearAxis(y_range_name="foo2"), 'right')

    return fig

count=(-1)
dct=dict(x=[],a=[],b=[],c=[])  
#Just a and b work fine but when 3rd axis c was added it doesnt !
source=ColumnDataSource(dct)
fig=plotcharts(source,'x','a','b','c') #c==3rd axis

def update_data():
    global count
    count=count+1
    y1 = np.random.randint(low=0, high=500)
    y2 = np.random.randint(low=0, high=50)
    y3 = np.random.randint(low=0, high=25) #y3==3rd axis

    if count%3==0:
        new_data = {
            'x': [count/3],
            'a': [y1],
            'b': [y2],
            'c': [y3]  #c==3rd axis
        }
        source.stream(new_data,rollover=20)

    else:
        l = len(df['a'])
        new_data = {
            'a': [(l - 1,y1)],
            'b': [(l - 1, y2)],
            'c': [(l - 1, y3)]  #c==3rd axis
        }
        source.patch(new_data)

curdoc().add_root(fig)
curdoc().add_periodic_callback(update_data,1000)

您的代码中有以下两行:

fig.extra_y_ranges = {"foo1": Range1d(start=0, end=50)}
[...]
fig.extra_y_ranges = {"foo2": Range1d(start=0, end=25)}
Bokeh并没有尝试在设置这些字段时使用一些特殊的魔法,所以使用后一个语句,您只需覆盖前一个语句。相反,您应该只写一行:

fig.extra_y_ranges = {"foo1": Range1d(start=0, end=50), "foo2": Range1d(start=0, end=25)}