散景小部件不更新情节

Posted

技术标签:

【中文标题】散景小部件不更新情节【英文标题】:bokeh widget does not update plot 【发布时间】:2021-10-20 17:53:06 【问题描述】:

我是散景图的新手,我正在尝试使用滑块绘制地图,但它没有更新。

我尝试了很多方法,但仍然没有更新剧情。

我正在使用散景服务器和非地理图我已经掌握了...

我正在做的是:

def get_dataset(dataframe,column,geometry_column,val):
    g = geodataframe[geodataframe[column] == val]
    g_gdf = gpd.GeoDataFrame(g, geometry=geometry_column)
    g_gdf.crs = 'EPSG:3857'
    return g_gdf

(此函数接收数据帧并返回按时间值过滤的地理数据帧

def plot_area(geodataframe ,title_name,w ,h ,hovertool=None, tile = None, cmp_colum = None ,palette_name = None,
              cmp = False,ax =False):

from bokeh.plotting import figure
from bokeh.tile_providers import get_provider
from bokeh.models import GeoJSONDataSource,ColumnDataSource,ColorBar,BasicTicker,LinearColorMapper

poligonos = GeoJSONDataSource(geojson=geodataframe.to_json())
tile_provider = get_provider(tile)
p = figure(title=title_name,plot_width=w, plot_height=h,tooltips=hovertool)
p.add_tile(tile_provider)
p.axis.visible = ax

if cmp:
    color_mapper = LinearColorMapper(palette = palette_name , low = geodataframe[cmp_colum].min(),
                             high = geodataframe[cmp_colum].max())
    color_bar = ColorBar(color_mapper=color_mapper, ticker=BasicTicker(),location=(0,0),
                             label_standoff=12)
    
    p.patches('xs','ys', source=poligonos, fill_alpha=1, line_width=0.5, line_color='black',  
        fill_color='field' :cmp_colum, 'transform': color_mapper)
    p.add_layout(color_bar, 'left')
else :
    pass

return p

这个函数绘制一个区域。

所以...

from bokeh.application import Application
from bokeh.application.handlers import FunctionHandler
from bokeh.models.widgets import DataTable,Paragraph
from bokeh.layouts import row, widgetbox
from bokeh.layouts import layout
from bokeh.models.widgets import Slider
import panel as pn
from bokeh.io import curdoc
from bokeh.io import show

g = get_dataset(precipitacao_por_bacia,'datahora','st_astext',dias[0])
g.reset_index(drop=True,inplace=True)
g['datahora'] = g['datahora'].apply(lambda x: str(x))
p = plot_area(g ,'Precipitação ',w = 500 ,h = 500, hovertool=[('Bacia','@bacia_nome'),
             ('precipitação','@val')],tile = 'CARTODBPOSITRON_RETINA', cmp_colum = 'val' ,
             palette_name = 'Viridis256',cmp = True,ax =False)

def update_map(attrname, old, new):
    g = get_dataset(precipitacao_por_bacia,'datahora','st_astext',dias[slider.value])
    g.reset_index(drop=True,inplace=True)
    plot_area(g ,'Precipitação ',w = 500 ,h = 500, hovertool=[('Bacia','@bacia_nome'),
             ('precipitação','@val')],tile = 'CARTODBPOSITRON_RETINA', cmp_colum = 'val' ,
              palette_name = 'Viridis256',cmp = True,ax =False)
    g['datahora'] = g['datahora'].apply(lambda x: str(x))
    output.text= str(g['datahora'][0])

slider = Slider(title="Day", value=0, start=0, end=409)
output=Paragraph()[enter image description here][1]

slider.on_change('value', update_map)
layout = row(p,widgetbox(slider,output))
curdoc().add_root(layout)

【问题讨论】:

【参考方案1】:

您正在通过调用plot_area 在您的回调中创建一个新图,但随后立即将其丢弃并且什么也不做。需要将其添加到文档中,以使其对客户端中呈现的内容产生任何影响。类似于

def update_map(attrname, old, new):

    p = plot_area(....)

    # replace the old plot with the new one
    layout.children[0] = p

【讨论】:

以上是关于散景小部件不更新情节的主要内容,如果未能解决你的问题,请参考以下文章

散景仪表板布局;小部件布局不显示

运行散景与交互式小部件

如何将小部件推广到具有不同选择的不同类?

当以html格式下载时,IPython交互式小部件不会以图形方式更新

在bokeh中嵌入散景应用程序

Swift UIView 小部件自动布局不起作用