GeoViews:使用“多边形"几何体向chloropleth添加滑块 [英] GeoViews: add a slider to chloropleth with Polygon geometries
问题描述
在此问题中,我正在尝试执行与OP类似的操作 Geoviews:将一个滑块添加到Choropleth映射,但尚未完全解决.简而言之,我有一个这样的GeoDataFrame:
I am trying to do something similar to the OP in this question Geoviews: Add a slider to choropleth map, but it wasn't fully answered. In brief, I have a GeoDataFrame like this:
我想通过GeoViews地图中的几何图形可视化pre_anom
,但是每个几何图形元素都有多年的使用时间.我想为额外的kdim年自动创建一个滑块,但是如果我将year指定为kdim,如下所示:
I would like to visualise pre_anom
by geometry in a GeoViews map, but I have multiple years for each geometry element. I'd like to have a slider created automatically for the extra kdim year, but if I specify year as a kdim like so:
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)
推荐答案
作为参考,虽然可以与GeoViews单行代码无缝协作非常好,但是我有一个使用Param和Panel的解决方法:
For reference, while it would be great for this to work seamlessly with the GeoViews one-liner, I have a workaround using Param and 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团队提供道具!
BTW, props to the whole PyViz team on a fantastic and still developing package!
这篇关于GeoViews:使用“多边形"几何体向chloropleth添加滑块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!