首页 > 解决方案 > 使用散景服务器更新 python 散景布局?

问题描述

我想做的事:

我使用散景、熊猫和地理熊猫制作了一张动态地图。要显示的数据从表中加载,然后每年映射到一个国家/地区。要显示的年份由散景滑块确定。您还可以将鼠标悬停在一个国家/地区上并获取其值。我现在希望能够通过选择单选按钮来更改数据源。为了正确显示数据,我想更改调色板,重新缩放它(范围从 50 到 100 而不是 0 到 4.5),将滑块上的缩放更新为新的最低年份到最高年份,然后显示带有新数据的世界地图。我还想将地图的标题从例如“生育力”更新为“预期寿命”。

我已经拥有的:

我有一个带有滑块和悬停工具的动态地图。我还有一个列表,从中获取要使用的数据(数据路径、要使用的标题、要使用的调色板、最高和最低年份、最高和最低值)。我有一个单选按钮组,有三种不同的数据源可供选择。所有路径都是相对的,数据具有一致的结构。我让地图更改了下面的数据并显示了新的东西,但是我做了一些事情并且它停止了工作。我还让悬停工具显示正确的值,但描述错误(旧)。

我需要帮助:

我已经尝试过的:

我已将整个加载和显示放在更改单选按钮组时执行的函数中。这个函数做的第一件事是清除布局然后重建它。不幸的是,这既不高效,也不工作,因为无论我做什么,我都只得到单选按钮组和下面的空白区域。我一直在寻找解决方案,但我发现(并尝试过)的所有东西都没有做我需要的。

如果需要,我可以提供实际代码(尽管一些变量和文档是德语的),但由于我对整个 python 的东西还很陌生,所以我现在不知道,那大约 300 行代码到底是什么你需要。现在就让我,我会尽力提供。

希望你能帮助我。

提前致谢,

789

编辑:正如评论中正确指出的那样,一些代码可以帮助理解我所做的事情。为简洁起见,我将削减所有导入,因为错误会在我的终端中显示为错误。也省略了评论。

geoFrame #dataframe for geopanda shapefile
configList = [0, "Fertility", 'YlGnBu', 'Year' ]

df #dataframe for the .csv  file

higStep = df['step'].max()
lowStep = df['step'].min()
configList.append(higStep)
higVal = df['valueInterest'].max()

merged = geoFrame.merge(df, left_on = 'country_code', right_on = 'code')

merged_json = json.loads(merged.to_json())
json_data = json.dumps(merged_json)

geosource = GeoJSONDataSource(geojson = json_data)

palette = brewer[configList[2]][8]
color_mapper = LinearColorMapper(palette = palette, low = 0, high = 4)

color_bar = ColorBar(color_mapper=color_mapper, label_standoff=8,width = 500, height = 20,
  border_line_color=None,location = (0,0), orientation = 'horizontal')

p = figure(title = configList[1], plot_height = 600 , plot_width = 950, toolbar_location = None)
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None
p.patches('xs','ys', source = geosource,fill_color = {'field' :'valueInterest', 'transform' : color_mapper},
          line_color = 'black', line_width = 0.25, fill_alpha = 1)
p.add_layout(color_bar, 'below')

df_curr = df[df['step'] == higStep]

color_mapper = LinearColorMapper(palette = palette, low = 0, high = 40, nan_color = '#d9d9d9')

def json_data(selectedStep):
    st = selectedStep
    df_st = df[df['step'] == st]
    merged = geoFrame.merge(df_st, left_on = 'country_code', right_on = 'code', how = 'left')
    merged_json = json.loads(merged.to_json())
    json_data = json.dumps(merged_json)
    return json_data

geosource = GeoJSONDataSource(geojson = json_data(higStep))

palette = brewer[configList[2]][8]
palette = palette[::-1]

color_mapper = LinearColorMapper(palette = palette, low = 0, high = higVal/2, nan_color = '#d9d9d9')

hover = HoverTool(tooltips = [ ('Country/region','@country'),(configList[1], '@valueInterest')])

color_bar = ColorBar(color_mapper=color_mapper, label_standoff=8,width = 500, height = 20,
           border_line_color=None,location = (0,0), orientation = 'horizontal')

p = figure(title = configList[1], plot_height = 600 , plot_width = 950, toolbar_location = None, tools = [hover])
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None
p.patches('xs','ys', source = geosource,fill_color = {'field' :'valueInterest', 'transform' : color_mapper},
          line_color = 'black', line_width = 0.25, fill_alpha = 1)
p.add_layout(color_bar, 'below')

def update_plot(attr, old, new):
    st = slider.value
    new_data = json_data(st)
    geosource.geojson = new_data
    p.title.text = configList[1] %st

slider = Slider(title = configList[3],start = 1950, end = 2015, step = 1, value = 2015)
slider.on_change('value', update_plot)


def radHandler(attr, new, old):
    if radio.active == 0:
        datapath = os.path.join(dataloc, 'children-per-woman-UN.csv')
        configList = [0, "Fertility", 'YlGnBu', 'Year']
    elif radio.active == 1:
        #see above with diferent data
    elif radio.active == 2:
        #see above with different data
        
    curdoc().clear()
    higStep = df['step'].max()
    lowStep = df['step'].min()
    configList.append(higStep)
    
    update_plot(attr, new, old)
    hover = HoverTool(tooltips = [ ('Country/region','@country'),(configList[1], '@valueInterest')])
    palette = brewer[configList[2]][8]
    palette = palette[::-1]
    olor_mapper = LinearColorMapper(palette = palette, low = 0, high = higVal/2, nan_color = '#d9d9d9')
    color_bar = ColorBar(color_mapper=color_mapper, label_standoff=8,width = 500, height = 20,
           border_line_color=None,location = (0,0), orientation = 'horizontal'
    p = figure(title = configList[1]+' '+str(configList[4]), plot_height = 600 , plot_width = 950, toolbar_location = None, tools = [hover])

    layout = column(widgetbox(radio),p,widgetbox(slider))
    curdoc().add_root(layout)

radio = RadioButtonGroup(labels=['Fertility', 'Life expectancy', 'Covid-19 total cases'], active=0)
radio.on_change('active',radHandler)

layout = column(p, widgetbox(radio),widgetbox(slider))

curdoc().title = configList[1]
curdoc().add_root(layout)

抱歉,我无法将其进一步煮熟,但我不知道什么是必不可少的,什么是花哨的东西。
此代码有效,直到我触摸单选按钮组。在那之后,情节本身就只是空白,任何地方都没有任何提示。代码本身并不完全是我的错,我对其进行了修复并可能对其进行了扩展,扩展是如上所述在数据源之间切换的能力。

标签: pythonbokehgeopandaspandas-bokeh

解决方案


推荐阅读