问题描述
是否有可能使用bokeh获得诸如sample1的图? Sample1是使用Matplotlib创建的。我的目标是在地图上绘制多条彼此分离的短线。但是这些线共享相同的来源,而与内部的来源只是不同的部分。
我已经写了一个小脚本,但是效果不是很好(请参阅Sample2)。我的skript在地图上绘制了3条不同的线。不幸的是,这些线是链接在一起的。
在Matplotlib中,它用于for循环。但是在bokeh中,我尝试使用滑块交互式地选择我希望查看的数据。
样本1
样本2
这是我的代码:
from bokeh.io import output_file,show
from bokeh.models import ColumnDataSource,GMapOptions,CustomJS
from bokeh.plotting import gmap,ColumnDataSource,figure
from bokeh.layouts import column,row
from bokeh.models.widgets import RangeSlider
import numpy as np
# data set
lon = [[48.7886,48.7887,48.7888,48.7889,48.789],[48.7876,48.7877,48.78878,48.7879,48.787],[48.7866,48.7867,48.7868,48.7869,48.786]]
lat = [[8.92,8.921,8.922,8.923,8.924],[8.91,8.911,8.912,8.913,8.914],[8.90,8.901,8.902,8.903,8.904]]
# convert data set in 1D for callback function (JS slice)
lat1D = []
lon1D = []
for k in range(len(lon)):
lat1D += lat[k]
lon1D += lon[k]
# define source and map
source = ColumnDataSource(data = {'x': lon1D,'y': lat1D})
map_options = GMapOptions(lat=48.7886,lng=8.92,map_type="satellite",zoom=13)
p = gmap("MY_API_KEY",map_options,title="Trajectory Map")
# plot lines on map
# for loops do not work like in matplotlib...
for j in range(0,len(lon1D),len(lon)):
for i in range(j,j + len(lon)):
p.line('y','x',source=source,line_width=0.4)
# slider to limit plotted data
range_slider = RangeSlider(title="Data Range Slider: ",start=0,end=len(lon1D),value=(0,len(lon1D)),step=1)
callback = CustomJS(args=dict(source=source,slider=range_slider,long=lon1D,lati=lat1D,lenght=len(lon)),code="""
var data = source.data;
const start = slider.value[0];
const end = slider.value[1];
data['x'] = long.slice(start,end)
data['y'] = lati.slice(start,end)
source.change.emit();
""")
range_slider.js_on_change('value',callback)
# Layout to plot and output
layout = row(
p,range_slider)
output_file("diag_plot_bike_data.html")
show(layout)
解决方法
任何可以用Matplotlib绘制的图形,都可以用Bokeh绘制的图形。有时代码更多,有时代码更少。
您的代码中发生了太多事情,所以我将以纯文本形式回答:
- 使用
multi_line
代替line
:https://docs.bokeh.org/en/latest/docs/user_guide/plotting.html#multiple-lines - 不要弄乱数据-您丢失的信息完全相同,您需要分开行。
multi_line
接受列表列表 - 您的
for
循环未按预期工作,因为您没有使用j
和i
索引。但是当您切换到multi_line
时,您甚至都不需要循环 - 请勿在{{1}}回调中更改原始数据源。您可以限制数据,但是将无法进行扩展,因为数据已经丢失。而是使用视图和过滤器过滤数据:https://docs.bokeh.org/en/latest/docs/user_guide/data.html#filtering-data