0

是否有可能使用 Bokeh 实现像 sample1 这样的图?Sample1 是使用 Matplotlib 创建的。我的目标是在地图上绘制多条彼此分开的短线。但是这些行共享相同的来源,只是与内部来源不同的部分。

我已经写了一个小脚本,但结果不是很好……(参见 Sample2)。我的脚本在地图上绘制了 3 条不同的线。不幸的是,这些线是连接在一起的。

在 Matplotlib 中,它与 for 循环一起使用。但在 Bokeh 中,我尝试使用滑块以交互方式选择我喜欢查看的数据。

样品1

样品1

样品2

样品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)
4

1 回答 1

2

任何可以用 Matplotlib 绘制的东西,都可以用 Bokeh 绘制。有时代码多一点,有时代码少一点。

您的代码中发生的事情太多了,所以我将以纯文本形式回答:

于 2020-10-20T14:29:53.307 回答