在同一数据集上使用Python Bokeh绘制多行
是否有可能与博克一起完成类似样本1的情节?Sample1是使用Matplotlib创建的。我的目标是在地图上画出多条彼此分开的短线。但是这些行共享同一个源,只是与内部源不同的部分 我已经写了一个小剧本,但效果不太好。。。(见样本2)。我的手稿在地图上画了三条不同的线。不幸的是,这些线是连在一起的 在Matplotlib中,它与for循环一起工作。但在Bokeh中,我尝试使用滑块以交互方式选择我喜欢查看的数据 样本1 样本2 这是我的密码:在同一数据集上使用Python Bokeh绘制多行,python,matplotlib,bokeh,bokehjs,pandas-bokeh,Python,Matplotlib,Bokeh,Bokehjs,Pandas Bokeh,是否有可能与博克一起完成类似样本1的情节?Sample1是使用Matplotlib创建的。我的目标是在地图上画出多条彼此分开的短线。但是这些行共享同一个源,只是与内部源不同的部分 我已经写了一个小剧本,但效果不太好。。。(见样本2)。我的手稿在地图上画了三条不同的线。不幸的是,这些线是连在一起的 在Matplotlib中,它与for循环一起工作。但在Bokeh中,我尝试使用滑块以交互方式选择我喜欢查看的数据 样本1 样本2 这是我的密码: from bokeh.io import outpu
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打印。有时代码多一点,有时代码少一点 您的代码中有太多内容,因此我将以纯文本形式回答:
- 使用
代替多行
:行
- 不要使数据扁平化—您正在丢失分隔行所需的相同信息<代码>多行接受列表列表
- 由于未使用
和j
索引,因此您的i
循环无法按预期工作。但是当您切换到for
时,甚至不需要循环多行
- 不要在
回调中更改原始数据源。您可以限制数据,但无法扩展数据,因为数据已经丢失。而是使用视图和过滤器过滤数据:CustomJS
bokeh
标签放在那里,我就会检查出来。