import numpy as np
from bokeh.plotting import *
from bokeh.models import ColumnDataSource
N = 300
x = np.linspace(0,4*np.pi, N)
y0 = np.sin(x)
y1 = np.cos(x)
output_notebook()
#create a column data source for the plots to share
source = ColumnDataSource(data = dict(x = x, y0 = y0, y1 = y1))
Tools = "pan, wheel_zoom, box_zoom, reset, save, box_select, lasso_select"
left = figure(tools = Tools, plot_width = 350, plot_height = 350, title = 'sinx')
left.circle(x, y0,source = source )
right = figure(tools = Tools, plot_width = 350, plot_height = 350 , title = 'cosx')
right.circle(x, y1, source = source)
p = gridplot([[left, right]])
show(p)
sin图有问题。不知道为什么'Bokeh'表现得像这样。但是如果我把y写成双引号或单引号/引号,那么事情就可以了。
left.circle(x, 'y0',source = source )
right.circle(x, 'y1', source = source)
p = gridplot([[left, right]])
show(p)
我试图解决问题的事情
1)重新启动笔记本电脑。 (解决问题的最简单方法)
2)生成输出到新窗口。
3)生成的图分别代替网格图。
请帮助我找出幕后的原因。
我做错了吗? 这是一个错误吗?
答案 0 :(得分:0)
如果要配置多个字形以共享单个ColumnDataSource
中的数据,则始终需要使用列的名称配置字形属性,并 < em> not 与实际数据文字一样,正如您所做的那样。换句话说:
left.circle('x', 'y0',source = source )
right.circle('x', 'y1', source = source)
请注意,我也引用了'x'
。这是在共享源时执行操作的正确方法。当您传递文字值(即真实列表或数组)时,像.circle
这样的字形函数会自动为您合成一列,以方便您使用。但是他们使用基于属性定义的名称,因此如果您在两个渲染器之间共享源,则第二次调用.circle
将覆盖第一次调用'y'
的列.circle
列制作。这正是你所看到的。
你可以想象,这种行为令人困惑。因此,只要明确提供source
参数,就会有open GitHub issue明确地完全禁止传递数据文字。我可以保证这会在不久的将来发生,所以如果你要共享一个源,你应该总是只传入列名(即字符串)。