散景在一个循环中绘制多个图像

时间:2019-11-16 10:41:20

标签: python plot bokeh

我想在bokeh中绘制多个图?例如,这段代码以非常低效的方式实现了我想要的功能。我想要相同的东西,但可能带有loop?或我不知道的任何bokeh功能。

p = figure(...)

p1 = figure(...)

p2 = figure(...)

y = [[1,2,3,4,5,6],[7,8,9,10,11,12],[3,1,4,3,2,5]]
x = [[2,3,4,5,6,7],[8,9,10,11,12,13],[1,4,3,2,5,6]]


plots = []
p.line(x=np.arange(6), y=y[0], color='#CE1141', legend='Prediction')
p.line(x=np.arange(6,12), y=x[0], color='#006BB6', legend='Prediction')
plots.append(p)

p1.line(x=np.arange(6), y=y[1], color='#CE1141', legend='Prediction')
p1.line(x=np.arange(6,12), y=x[1], color='#006BB6', legend='Prediction')
plots.append(p1)

p2.line(x=np.arange(6), y=y[2], color='#CE1141', legend='Prediction')
p2.line(x=np.arange(6,12), y=x[2], color='#006BB6', legend='Prediction')
plots.append(p2)


show(column(*plots))

基本上,我有两个2D数组,我想在一个图中绘制一对。我在for loop中尝试过,但是它可以绘制出图中的所有内容并多次显示相同的绘制,我尝试过类似的操作:

for i in range(3):
    p.line(x=np.arange(6), y=y[i], color='#CE1141', legend='Prediction')
    p.line(x=np.arange(6,12), y=x[i], color='#006BB6', legend='Prediction')
p.show()

我可以在这里看到问题所在,所有内容都在p中绘制,因此最后我得到了一个绘制所有内容的图。

我也尝试创建一个数组并将图添加到其中,如上面工作效率低下的示例所示,但它显示了第一列的空白图,最后绘制了其中包含所有内容的单个图。

1 个答案:

答案 0 :(得分:2)

您可以这样做,例如这样,使用列表理解(Bokeh v1.3.0):

from bokeh.plotting import figure, show
from bokeh.layouts import gridplot
import numpy as np

plots = [figure() for i in range(3)]
glyphs = [plot.line(np.arange(10), np.random.random(10)) for plot in plots for i in range(2)]
show(gridplot(children = plots, ncols = 1, merge_tools = False))

或者如果您确实需要一个for循环:

from bokeh.plotting import figure, show
from bokeh.layouts import column
import numpy as np

plots = []
for i in range(3):
    p = figure()
    glyphs = [p.line(np.arange(10), np.random.random(10)) for j in range(2)]
    plots.append(p)
show(column(*plots))

重点是,您只能将单个模型对象传递给show()函数,因此您需要将所有图解打包到layoutgridplotcolumn。很高兴知道每个row都会隐式创建一个散景document,您要传递给show()函数的所有模型都将附加到该散景。在Bokeh中,每个show()只能附加一个模型。所以例如您不能在同一脚本中多次执行document,而无需显式创建新的show(column(*plots))