添加散景滑块使仪表板为空白

问题描述 投票:0回答:1

我正在尝试添加滑块来过滤显示在世界地图上的城市。当我仅使用下面的代码添加所有城市时,效果很好。

import pandas as pd
import numpy as np

import geopandas
import geoplot
import json

from bokeh.io import output_notebook, show, output_file
from bokeh.models import  (NumeralTickFormatter, Select, CDSView, ColorBar, ColumnDataSource,
                          CustomJS, CustomJSFilter,
                          GeoJSONDataSource, HoverTool,
                          LinearColorMapper, Slider)
from bokeh.io.doc import curdoc
from bokeh.layouts import column, row, widgetbox
from bokeh.palettes import brewer
from bokeh.plotting import figure, Figure


world = geopandas.read_file(
    geopandas.datasets.get_path('naturalearth_lowres')
)
bokeh_ready = json.dumps(json.loads(world.to_json()))

geosource = GeoJSONDataSource(geojson = world.to_json())

cities = pd.read_csv('/Users/620751/Documents/cities.csv')


geocities = GeoJSONDataSource(geojson = cities[['Leg_Orig', 'Leg_Dest', 'MAILG_CTY_NM', 'MAILG_ST_CTRY_NM',
       'Leg_Dep_Dt', 'Opr_Car_Flt_Nbr', 'Leg_Dep_Tm','Leg_Arrv_Dt_Tm',
       'Opr_Car_Cd', 'Leg_Dep_Dt_Tm', 'd1_avail', 'cp_avail', 'mn_avail',
       'ot_avail', 'total_seats', 'dest_lat', 'dest_long', 'geometry']].to_json())

cities_input = cities[['Leg_Orig', 'Leg_Dest', 'MAILG_CTY_NM', 'MAILG_ST_CTRY_NM',
                       'Leg_Dep_Dt', 'Opr_Car_Flt_Nbr', 'Leg_Dep_Tm', 'Leg_Arrv_Dt_Tm',
                       'Opr_Car_Cd', 'Leg_Dep_Dt_Tm', 'd1_avail', 'cp_avail', 'mn_avail',
                       'ot_avail', 'total_seats', 'dest_lat', 'dest_long', 'geometry', 'duration_hours']]


p1 = Figure(title = 'Flights', 
           plot_height = 720 ,
           plot_width = 1200, 
           toolbar_location = 'below',
           tools = 'pan, wheel_zoom, box_zoom, reset')

p1.xgrid.grid_line_color = None
p1.ygrid.grid_line_color = None# Add patch renderer to figure.

countries = p1.patches('xs','ys', source = geosource,
                   fill_color = None,
                   line_color = 'gray', 
                   line_width = 0.25, 
                   fill_alpha = 1)# Create hover tool

p1.add_tools(HoverTool(renderers = [countries],
                      tooltips = [('Country','@name')]))


cities_input = cities[['Leg_Orig', 'Leg_Dest', 'MAILG_CTY_NM', 'MAILG_ST_CTRY_NM',
       'Leg_Dep_Dt', 'Opr_Car_Flt_Nbr', 'Leg_Dep_Tm','Leg_Arrv_Dt_Tm',
       'Opr_Car_Cd', 'Leg_Dep_Dt_Tm', 'd1_avail', 'cp_avail', 'mn_avail',
       'ot_avail', 'total_seats', 'dest_lat', 'dest_long', 'geometry','duration_hours']]





city_source = ColumnDataSource(cities.drop('geometry', axis=1))
city_pt = p1.circle('dest_long', 'dest_lat', source = newsource,
                       color='red')

p1.add_tools(HoverTool(renderers = [newsource],line_policy='next',
                          tooltips = [('City','@MAILG_CTY_NM'),
                                     ('Departure Time','@Leg_Dep_Dt_Tm'),
                                     ('Seats','@seats'),
                                     ('Flight Time','@duration_hours' + ' hours'),
                                     ('weather', '@weather_desc' + ' low:' + '@low_temp' + ' high:' + '@high_temp' + ' rain:' + '@rain')]))


layout = column(p1)
curdoc().add_root(layout)

[当我尝试添加滑块以过滤地图上显示的城市时(基于使用'duration_hours'列的基础城市的飞行时间,我尝试将代码更改为此:]

import pandas as pd
import numpy as np

import geopandas
import geoplot
import json

from bokeh.io import output_notebook, show, output_file
from bokeh.models import  (NumeralTickFormatter, Select, CDSView, ColorBar, ColumnDataSource,
                          CustomJS, CustomJSFilter,
                          GeoJSONDataSource, HoverTool,
                          LinearColorMapper, Slider)
from bokeh.io.doc import curdoc
from bokeh.layouts import column, row, widgetbox
from bokeh.palettes import brewer
from bokeh.plotting import figure, Figure


world = geopandas.read_file(
    geopandas.datasets.get_path('naturalearth_lowres')
)
bokeh_ready = json.dumps(json.loads(world.to_json()))

geosource = GeoJSONDataSource(geojson = world.to_json())

cities = pd.read_csv('/Users/620751/Documents/cities.csv')

#cities = geopandas.GeoDataFrame(lat_long1, geometry=geopandas.points_from_xy(lat_long.dest_long, lat_long.dest_lat))
cities['Leg_Arrv_Dt_Tm'] = [str(a) for a in cities['Leg_Arrv_Dt_Tm']]
cities['Leg_Dep_Dt_Tm'] = [str(a) for a in cities['Leg_Dep_Dt_Tm']]
cities['Leg_Dep_Dt'] = [str(a) for a in cities['Leg_Dep_Dt']]
cities.Leg_Dep_Tm = [str(a) for a in cities['Leg_Dep_Tm']]
geocities = GeoJSONDataSource(geojson = cities[['Leg_Orig', 'Leg_Dest', 'MAILG_CTY_NM', 'MAILG_ST_CTRY_NM',
       'Leg_Dep_Dt', 'Opr_Car_Flt_Nbr', 'Leg_Dep_Tm','Leg_Arrv_Dt_Tm',
       'Opr_Car_Cd', 'Leg_Dep_Dt_Tm', 'd1_avail', 'cp_avail', 'mn_avail',
       'ot_avail', 'total_seats', 'dest_lat', 'dest_long', 'geometry']].to_json())

cities_input = cities[['Leg_Orig', 'Leg_Dest', 'MAILG_CTY_NM', 'MAILG_ST_CTRY_NM',
                       'Leg_Dep_Dt', 'Opr_Car_Flt_Nbr', 'Leg_Dep_Tm', 'Leg_Arrv_Dt_Tm',
                       'Opr_Car_Cd', 'Leg_Dep_Dt_Tm', 'd1_avail', 'cp_avail', 'mn_avail',
                       'ot_avail', 'total_seats', 'dest_lat', 'dest_long', 'geometry', 'duration_hours']]


p1 = Figure(title = 'Flights', 
           plot_height = 720 ,
           plot_width = 1200, 
           toolbar_location = 'below',
           tools = 'pan, wheel_zoom, box_zoom, reset')

p1.xgrid.grid_line_color = None
p1.ygrid.grid_line_color = None# Add patch renderer to figure.

countries = p1.patches('xs','ys', source = geosource,
                   fill_color = None,
                   line_color = 'gray', 
                   line_width = 0.25, 
                   fill_alpha = 1)# Create hover tool

p1.add_tools(HoverTool(renderers = [countries],
                      tooltips = [('Country','@name')]))

cities_input = cities[['Leg_Orig', 'Leg_Dest', 'MAILG_CTY_NM', 'MAILG_ST_CTRY_NM',
       'Leg_Dep_Dt', 'Opr_Car_Flt_Nbr', 'Leg_Dep_Tm','Leg_Arrv_Dt_Tm',
       'Opr_Car_Cd', 'Leg_Dep_Dt_Tm', 'd1_avail', 'cp_avail', 'mn_avail',
       'ot_avail', 'total_seats', 'dest_lat', 'dest_long', 'geometry','duration_hours']]

def json_data(duration):
    dur = duration
    df_dur = cities_input[cities_input['duration_hours'] <= dur]
    dur_json = json.loads(df_dur.to_json())
    json_data = json.dumps(dur_json)
    return json_data

newsource = GeoJSONDataSource(geojson = json_data(24))

def update_plot(attr, old, new):
    yr = slider.value
    new_data = json_data(yr)
    newsource.geojson = new_data


slider = Slider(title='Duration', start=0, end = int(np.round(cities.duration_hours.max(),0)), step=1, value=12)


city_pt = p1.circle('dest_long', 'dest_lat', source = newsource,
                       color='red')

p1.add_tools(HoverTool(renderers = [newsource],line_policy='next',
                          tooltips = [('City','@MAILG_CTY_NM'),
                                     ('Departure Time','@Leg_Dep_Dt_Tm'),
                                     ('Seats','@seats'),
                                     ('Flight Time','@duration_hours' + ' hours'),
                                     ('weather', '@weather_desc' + ' low:' + '@low_temp' + ' high:' + '@high_temp' + ' rain:' + '@rain')]))

slider.on_change('value', update_plot)

layout = column(p1,widgetbox(slider))
curdoc().add_root(layout)

而不是将所有城市都显示为红点的地图,我得到了一个空白屏幕。我不确定自己犯了什么愚蠢的错误,但我希望有人可以吗?

我正在尝试添加滑块来过滤显示在世界地图上的城市。当我只用下面的代码添加所有城市时,它工作正常。将pandas作为pd导入,将numpy作为np import导入...

python bokeh
1个回答
0
投票

Welp,我不得不重写其中一部分,但是我可以正常使用。归功于我从中窃取了代码模板的向datascience。

© www.soinside.com 2019 - 2024. All rights reserved.