在布局中绘制多个图表的散景会引发错误:(BOTH_CHILD_AND_ROOT)

Posted

技术标签:

【中文标题】在布局中绘制多个图表的散景会引发错误:(BOTH_CHILD_AND_ROOT)【英文标题】:Bokeh ploting multiples charts in a layout throws ERROR : (BOTH_CHILD_AND_ROOT) 【发布时间】:2016-08-15 21:01:17 【问题描述】:

今天我在创建一个使用 Bokeh 0.11.1 可视化数据的网络应用程序时寻求帮助。

首先,我使用 Python 2.7 和 Django 1.9.5 来运行应用程序。我正在使用 PyCharm 专业版编程,所有这些都在 Windows 7 上运行。

起初,Bokeh 对我来说一切正常,我创建了一些函数来绘制绘图并将它们添加到我的模板中。当我创建了几个不同的绘图函数时,我认为像这样继续下去是个坏主意,意思是逐个绘制每个绘图并将其 javascript 添加到我的模板中。

我想这样做是因为我认为每次您要求 Bokeh 绘制单个图表时,它都会在 javascript 中编写许多冗余函数。毕竟,任何生成的 javascript 都是独立的。我想如果我要求 Bokeh 以相同的布局绘制所有图表,它不会将相同的 javascript 函数写成 X 倍。此外,在我的 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)

当我用它来创建 Bokeh vform 并用 Django 显示它时,我的页面仍然是空白的。 hplot、vform 和 gridplot 也发生了同样的事情。

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

ERROR:C:\Python27\lib\site-packages\bokeh\core\validation\check.py:W-1004 (BOTH_CHILD_AND_ROOT):如果模型位于布局框中,则它们不应是文档根:图, 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):如果模型位于布局框中,则它们不应是文档根:图, ViewModel:Plot, ref_id: 77ff5340-e67d-4802-8997-79e84e19d206, Chart, ViewModel:Plot, ref_id: f725c7c5-fade-48f6-a4f8-a159dc32002e, Chart, ViewModel:Plot, ref_id: c96bf6132-53c2-4 -9ae9-b27bab1dcf85, 图表, ViewModel:Plot, ref _id: 320afbf4-03f5-4b78-b299-d1799fb607c8

然后我的默认浏览器打开并显示文件 layout.html,该文件保持空白。

我已经在互联网上搜索了问题应该是什么。正如here 所说,我将每个figure 实例都更改为Figure 实例。然而,它不起作用,而且我的主应用程序使用 BarScatter 图表,它们也不起作用。

在this其他话题中,据说问题可能来自PyCharm。但是我不认为这是问题所在,手动打开 layout.html 也会显示一个空白页面,并且当我不尝试将其嵌入单个 vplot 或vform 而是一一显示。

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

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

感谢您的帮助。

26/04/2016 编辑:

有人帮我加入了 Bokeh 的 google 小组。这些是目前对我不起作用的一些解决方案,但可能会对遇到相同错误的人有所帮助:

-使用 vbox 或 vplot 代替 vform(在我的情况下不起作用,因为我正在使用小部件,我需要一个 vform)

-使用 p.add_layout 手动扩展渲染器

【问题讨论】:

【参考方案1】:

Bokeh 在它还是一个年轻的图书馆时经历了相当多的变化和实验,但事情终于安定下来了。自发布此问题以来,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)

【讨论】:

以上是关于在布局中绘制多个图表的散景会引发错误:(BOTH_CHILD_AND_ROOT)的主要内容,如果未能解决你的问题,请参考以下文章

CustomJS 回调上的散景布局更新

在意大利地图上呈现数据的散景

使用 color_mapper 隐藏基于分类数据的散景字形

Django网站中的散景渲染问题

散景折线图未绘制完整的熊猫数据框

带有 HoverTool 的散景线图