在同一数据集上使用Python Bokeh绘制多行

在同一数据集上使用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

是否有可能与博克一起完成类似样本1的情节?Sample1是使用Matplotlib创建的。我的目标是在地图上画出多条彼此分开的短线。但是这些行共享同一个源,只是与内部源不同的部分

我已经写了一个小剧本,但效果不太好。。。(见样本2)。我的手稿在地图上画了三条不同的线。不幸的是,这些线是连在一起的

在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打印。有时代码多一点,有时代码少一点

您的代码中有太多内容,因此我将以纯文本形式回答:

  • 使用
    多行
    代替
  • 不要使数据扁平化—您正在丢失分隔行所需的相同信息<代码>多行接受列表列表
  • 由于未使用
    j
    i
    索引,因此您的
    for
    循环无法按预期工作。但是当您切换到
    多行
    时,甚至不需要循环
  • 不要在
    CustomJS
    回调中更改原始数据源。您可以限制数据,但无法扩展数据,因为数据已经丢失。而是使用视图和过滤器过滤数据:

谢谢您的回答。这真的很有帮助!我决定使用on_change,而不是js_on_change来设置range_滑块。现在我的回调函数出现了一些问题。。。我想用range\u滑块更改我的绘图索引过滤器。当我直接在回调中访问plot.view时,如何完成此任务它将不起作用…:/这似乎是一个与此完全不同的问题。请问一个新问题,完整的代码?只要确保把
bokeh
标签放在那里,我就会检查出来。