我想在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
中绘制,因此最后我得到了一个绘制所有内容的图。
我也尝试创建一个数组并将图添加到其中,如上面工作效率低下的示例所示,但它显示了第一列的空白图,最后绘制了其中包含所有内容的单个图。
答案 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()
函数,因此您需要将所有图解打包到layout
,gridplot
或column
。很高兴知道每个row
都会隐式创建一个散景document,您要传递给show()
函数的所有模型都将附加到该散景。在Bokeh中,每个show()
只能附加一个模型。所以例如您不能在同一脚本中多次执行document
,而无需显式创建新的show(column(*plots))
。