我想做的事:
我使用散景、熊猫和地理熊猫制作了一张动态地图。要显示的数据从表中加载,然后每年映射到一个国家/地区。要显示的年份由散景滑块确定。您还可以将鼠标悬停在一个国家/地区上并获取其值。我现在希望能够通过选择单选按钮来更改数据源。为了正确显示数据,我想更改调色板,重新缩放它(范围从 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)
抱歉,我无法将其进一步煮熟,但我不知道什么是必不可少的,什么是花哨的东西。
此代码有效,直到我触摸单选按钮组。在那之后,情节本身就只是空白,任何地方都没有任何提示。代码本身并不完全是我的错,我对其进行了修复并可能对其进行了扩展,扩展是如上所述在数据源之间切换的能力。