1

我正在尝试在这个问题Geoviews: Add a slider to choropleth map中做类似于 OP 的事情,但它没有得到完全回答。简而言之,我有一个这样的 GeoDataFrame:

具有多边形几何形状的 GeoDataFrame

我想pre_anom在 GeoViews 地图中按几何图形进行可视化,但每个几何元素都有多年的时间。我想为额外的 kdim 年份自动创建一个滑块,但如果我将年份指定为 kdim,如下所示:

gv.Polygons(gdf, kdims=['year'], vdims=['pre_anom']).opts(width=600, height=600, 
                                                      tools=['hover'], colorbar=True, 
                                                      cmap='RdBu', color_index='pre_anom',
                                                      symmetric=True, toolbar='above',
                                                      line_color='white')

我收到以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-78-0358d9976c72> in <module>
----> 1 gv.Polygons(gdf, kdims=['year'], vdims=['pre_anom']).opts(width=600, height=600, tools=['hover'], 
      2                                                           colorbar=True, cmap='RdBu', color_index='pre_anom',
      3                                                           symmetric=True, toolbar='above', line_color='white')

~/.conda/envs/anaconda3.6/lib/python3.6/site-packages/geoviews/element/geo.py in __init__(self, data, kdims, vdims, **kwargs)
     98         elif isinstance(data, _Element):
     99             kwargs['crs'] = data.crs
--> 100         super(_Element, self).__init__(data, kdims=kdims, vdims=vdims, **kwargs)
    101 
    102 

~/.conda/envs/anaconda3.6/lib/python3.6/site-packages/holoviews/element/path.py in __init__(self, data, kdims, vdims, **params)
    217         else:
    218             params['vdims'] = vdims
--> 219         super(Contours, self).__init__(data, kdims=kdims, **params)
    220         if params.get('level') is not None:
    221             with disable_constant(self):

~/.conda/envs/anaconda3.6/lib/python3.6/site-packages/holoviews/element/path.py in __init__(self, data, kdims, vdims, **params)
     90 
     91         super(Path, self).__init__(data, kdims=kdims, vdims=vdims,
---> 92                                    datatype=datatype, **params)
     93 
     94 

~/.conda/envs/anaconda3.6/lib/python3.6/site-packages/holoviews/core/data/__init__.py in __init__(self, data, kdims, vdims, **kwargs)
    210                                            datatype=kwargs.get('datatype'))
    211         (data, self.interface, dims, extra_kws) = initialized
--> 212         super(Dataset, self).__init__(data, **dict(kwargs, **dict(dims, **extra_kws)))
    213         self.interface.validate(self, validate_vdims)
    214 

~/.conda/envs/anaconda3.6/lib/python3.6/site-packages/holoviews/core/dimension.py in __init__(self, data, kdims, vdims, **params)
    994             params['cdims'] = {d if isinstance(d, Dimension) else Dimension(d): val
    995                                for d, val in params['cdims'].items()}
--> 996         super(Dimensioned, self).__init__(data, **params)
    997         self.ndims = len(self.kdims)
    998         cdims = [(d.name, val) for d, val in self.cdims.items()]

~/.conda/envs/anaconda3.6/lib/python3.6/site-packages/holoviews/core/dimension.py in __init__(self, data, id, plot_id, **params)
    650             params['group'] = long_name
    651 
--> 652         super(LabelledData, self).__init__(**params)
    653         if not util.group_sanitizer.allowable(self.group):
    654             raise ValueError("Supplied group %r contains invalid characters." %

~/.conda/envs/anaconda3.6/lib/python3.6/site-packages/param/parameterized.py in __init__(self, **params)
   2029         self.param._generate_name()
   2030 
-> 2031         self.param._setup_params(**params)
   2032         object_count += 1
   2033 

~/.conda/envs/anaconda3.6/lib/python3.6/site-packages/param/parameterized.py in override_initialization(self_, *args, **kw)
    808         original_initialized=parameterized_instance.initialized
    809         parameterized_instance.initialized=False
--> 810         fn(parameterized_instance,*args,**kw)
    811         parameterized_instance.initialized=original_initialized
    812     return override_initialization

~/.conda/envs/anaconda3.6/lib/python3.6/site-packages/param/parameterized.py in _setup_params(self_, **params)
    950                 self.param.warning("Setting non-parameter attribute %s=%s using a mechanism intended only for parameters",name,val)
    951             # i.e. if not desc it's setting an attribute in __dict__, not a Parameter
--> 952             setattr(self,name,val)
    953 
    954     @classmethod

~/.conda/envs/anaconda3.6/lib/python3.6/site-packages/param/__init__.py in __set__(self, obj, val)
   1217     def __set__(self,obj,val):
   1218         """Set to the given value, raising an exception if out of bounds."""
-> 1219         self._check_bounds(val)
   1220         super(List,self).__set__(obj,val)
   1221 

~/.conda/envs/anaconda3.6/lib/python3.6/site-packages/param/__init__.py in _check_bounds(self, val)
   1236             if min_length is not None and max_length is not None:
   1237                 if not (min_length <= l <= max_length):
-> 1238                     raise ValueError("%s: list length must be between %s and %s (inclusive)"%(self._attrib_name,min_length,max_length))
   1239             elif min_length is not None:
   1240                 if not min_length <= l:

ValueError: kdims: list length must be between 2 and 2 (inclusive)
4

1 回答 1

1

作为参考,虽然它可以与 GeoViews 单线无缝工作,但我有一个使用 Param 和 Panel 的解决方法:

import pandas as pd
import geopandas as gpd
import geoviews as gv
import param
import panel as pn
gv.extension('bokeh')

opts = dict(width=600, height=600, tools=['hover'], colorbar=True, cmap='RdBu', 
            color_index='pre_anom', symmetric=True, toolbar='above',line_color='white')

class PreMEI(param.Parameterized):
    year = param.Integer(default=2017, bounds=(1980, 2017))

    def chloro(self):
        return gv.Polygons(gdf[gdf['year']==self.year], vdims=['pre_anom'])

    @param.depends('year')
    def view_chloro(self):
        return gv.DynamicMap(self.chloro).opts(**opts)

p = PreMEI()
doc = pn.Row(p.param, p.view_chloro)

给出: 在此处输入图像描述

顺便说一句,为整个 PyViz 团队提供一个很棒且仍在开发中的软件包!

于 2019-03-26T13:58:29.190 回答