Bokeh绘制布局中的多个图表会引发错误:(两个是\u CHILD_和\u ROOT)

2024-09-24 20:33:50 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我在用bokeh0.11.1创建一个web应用程序来可视化数据时请求一些帮助。在

首先,我使用python2.7和django1.9.5来运行这个应用程序。我用PyCharm专业版编程,所有这些都在Windows7上运行。在

起初,Bokeh对我来说一切都很好,我创建了一些函数来绘制绘图并将这些添加到我的模板中。当我为绘图创建了几个不同的函数时,我认为这样做不是个好主意,也就是说,一个接一个地绘制每个绘图,并将其javascript添加到我的模板中。在

我之所以这么做,是因为我认为每次你让Bokeh绘制一个图表时,Bokeh都会用javascript编写许多冗余函数。毕竟,任何javascript生成都是独立的。我想如果我让Bokeh在同一个布局中绘制所有的图表,它将不会乘以相同的javascript函数。此外,在我的python代码中,发送一个布局要比为每个图表/绘图发送一个包含javascript的字符串要简单得多。在

因此,我尝试在同一布局中嵌入多个绘图,如Bokeh 0.11.1文档中的示例所示:

from bokeh.io import output_file, show, vplot
from bokeh.plotting import figure

output_file("layout.html")

x = list(range(11))
y0 = x
y1 = [10 - i for i in x]
y2 = [abs(i - 5) for i in x]

# create a new plot
s1 = figure(width=250, plot_height=250, title=None)
s1.circle(x, y0, size=10, color="navy", alpha=0.5)

# create another one
s2 = figure(width=250, height=250, title=None)
s2.triangle(x, y1, size=10, color="firebrick", alpha=0.5)

# create and another
s3 = figure(width=250, height=250, title=None)
s3.square(x, y2, size=10, color="olive", alpha=0.5)

# put all the plots in a VBox
p = vplot(s1, s2, s3)

# show the results
show(p)

当我用这个创建一个bokehvform并用Django显示它时,我的页面仍然是空白的。hplot、vform和gridplot也发生了同样的情况。在

然后,我尝试在PyCharm python控制台中运行我的代码,以便更好地理解问题所在,当运行bokeh示例中的代码(以及我自己的代码)时,控制台返回:

ERROR:C:\Python27\lib\site-packages\bokeh\core\validation\check.py:W-1004 (BOTH_CHILD_AND_ROOT): Models should not be a document root if they are in a layout box: Figure, ViewModel:Plot, ref _id: 77ff5340-e67d-4802-8997-79e84e19d206

ERROR:C:\Python27\lib\site-packages\bokeh\core\validation\check.py:W-1004 (BOTH_CHILD_AND_ROOT): Models should not be a document root if they are in a layout box: Figure, ViewModel:Plot, ref _id: 77ff5340-e67d-4802-8997-79e84e19d206, Chart, ViewModel:Plot, ref _id: f725c7c5-fade-48f6-a4f8-a159dc32002e, Chart, ViewModel:Plot, ref _id: c96b8132-53c2-44f6-9ae9-b27bab1dcf85, Chart, ViewModel:Plot, ref _id: 320afbf4-03f5-4b78-b299-d1799fb607c8

然后我的默认浏览器打开并显示该文件布局.html,仍为空白。在

我已经在网上搜索过问题出在哪里了。正如here所说,我将图的每个实例都改为的实例。但是,它不起作用,而且我的主应用程序使用了条形图,以及散点图,它们也不起作用。在

this其他主题中,据说问题可能来自PyCharm。但我不认为这是问题,手动打开布局.html也会显示一个空白页,当我不试图将其嵌入到单个vplot或vform中而是逐个显示时,我的绘图和图表工作正常。在

以前,当我试图用这个piece of code向我的图表添加一些Bokeh小部件时,也遇到过类似的问题,因为我使用了vplothplot而不是vform。所以这不是我今天要面对的,我正确地使用了bokehvform来正确地显示我的小部件。在

我真的很想知道,即使文档中给出的示例也不起作用,到底出了什么问题。我做错什么了?在使用vforms/plots之前,我需要做些什么吗?在

谢谢你的帮助。在

编辑2016年4月26日:

有人帮了我一把。以下是一些目前不适用于我的解决方案,但可能会帮助有相同错误的人:

-使用vbox或vplot而不是vform(在我的例子中不起作用,因为我使用的是widgets,我需要一个vform)

-使用p.add_布局手动扩展渲染器


Tags: 函数inrefid绘图plot图表bokeh
1条回答
网友
1楼 · 发布于 2024-09-24 20:33:50

当博克还是一个年轻的图书馆时,它经历了很多改变和试验,但事情终于安定下来了。自从这个问题被发布以来,像vformvplot这样的函数已经被删除,这里描述的问题也得到了解决。在任何最新版本中,用户都应该使用column布局函数来获得一列绘图或小部件,并且它的行为与预期的一样。以下是更新的示例:

from bokeh.io import output_file, show
from bokeh.layouts import column
from bokeh.plotting import figure

output_file("layout.html")

x = list(range(11))
y0 = x
y1 = [10 - i for i in x]
y2 = [abs(i - 5) for i in x]

# create a new plot
s1 = figure(width=250, plot_height=250, title=None)
s1.circle(x, y0, size=10, color="navy", alpha=0.5)

# create another one
s2 = figure(width=250, height=250, title=None)
s2.triangle(x, y1, size=10, color="firebrick", alpha=0.5)

# create and another
s3 = figure(width=250, height=250, title=None)
s3.square(x, y2, size=10, color="olive", alpha=0.5)

# put all the plots in a VBox
p = column(s1, s2, s3)

# show the results
show(p)

enter image description here

相关问题 更多 >