GeoView:将matplotlib样式参数应用于面元素

lnlaulya  于 2023-03-03  发布在  其他
关注(0)|答案(1)|浏览(137)

已安装的软件包

全息视图1.14.4、地理视图1.9.1、Map绘制库3.4.2。

我想做的是

我尝试使用GeoViewsmatplolib后端应用简单的每个要素样式。我不知道如何将不同的edgecolor=参数应用到同一个叠加中的不同gv.Polygons元素。由于某种原因,它们 * 总是 * 浅蓝色...
类似地,facecolor=似乎没有影响。

可重现的代码示例

这使用了完整数据集的一个非常小的样本。

import pandas as pd
import geopandas as gpd
import geoviews as gv
from geoviews import opts

# loading both extensions as the full script calls for user input
# to choose between an interactive or static output

gv.extension('bokeh', 'matplotlib')

d1 = {'use': {0: 'Residential', 1: 'Residential'},
 'geometry': {0: 'POLYGON ((13.80961103741604 51.04076975651729, 13.80965521888065 51.04079016168103, 13.80963851766593 51.04080454197601, 13.80959433642561 51.04078412781548, 13.80961103741604 51.04076975651729))',
  1: 'POLYGON ((13.80977831740752 51.04313480566009, 13.80987122363639 51.04306085051974, 13.8099989591537 51.04312462457182, 13.80995486494384 51.04315973323087, 13.8099651184249 51.04316486464228, 13.80991634926543 51.04320371166482, 13.80977831740752 51.04313480566009))'}}

gdf1 = gpd.GeoDataFrame(pd.DataFrame(d1), geometry=gpd.GeoSeries.from_wkt(pd.DataFrame(d1)['geometry']), crs="EPSG:4326")

d2 = {'geometry': {1: 'POLYGON ((13.80894179055831 51.04544128170094, 13.80952887156242 51.0450399782091, 13.80954152432486 51.04504668985658, 13.80896834397535 51.04545611172818, 13.80894179055831 51.04544128170094))'}}

gdf2 = gpd.GeoDataFrame(pd.DataFrame(d2), geometry=gpd.GeoSeries.from_wkt(pd.DataFrame(d2)['geometry']), crs="EPSG:4326")

layout = gv.Polygons(gdf1, group="group1") * gv.Polygons(gdf2, group="group2")

layout.opts(
            opts.Polygons('group1', cmap=['red'], edgecolor='black', linewidth=0.5, xaxis=None, yaxis=None, backend="matplotlib"),
            opts.Polygons('group2', cmap=['lightblue'], edgecolor='blue', linewidth=0.5, backend="matplotlib"),
            opts.Overlay(fig_size=500, backend='matplotlib')
        )
        
gv.output(layout, backend='matplotlib')

gv.save(layout, "test.svg", dpi=600, backend='matplotlib')

观察到的行为的屏幕截图

这是来自完整数据集的屏幕。

预期行为

红色的填充多边形属于gdf1,应该有黑色的边缘颜色,但它是浅蓝色的;蓝色的填充多边形属于gdf2,应该有浅蓝色的填充和蓝色的边缘颜色,但似乎填充和边缘都使用了相同的颜色。

我所尝试的

我没有使用group=参数来指定每个Polygon元素的样式(我在datashader文档中偶然发现的),而是尝试按照这里的HoloViews文档中的建议,“内联”地调用多个opts
此外,cmap=['color']是我发现的唯一一种方法,可以让GeoViews*不 * 使用gdf1中自动检测到的“use”列作为vdim进行颜色Map。这是规范方法和/或预期行为吗?color=facecolor=似乎没有效果,即使在调用gv.help(gv.opts.Polygons)时列出了它们。
简而言之,我不明白如何为matplotlib后端应用这些特定的样式参数,如果有任何提示,我将非常感激。

21年8月2日编辑

另一个奇怪的行为似乎是解释器中的图形(在我的例子中是VSCode-Python),其中的符号系统似乎被忠实地表示,看起来与gv.save(layout, "test.svg", dpi=600, backend='matlplotlib')生成的.svg输出不同。
解释器输出:

gv.save()输出:

velaa5lx

velaa5lx1#

可能是某个使用的包中的bug。似乎可以在Python 3.8上使用这些包版本(在用conda create -n py38 -c pyviz -c conda-forge geoviews iris xesmf python=3.8创建的新Anaconda环境中):

  • 地理视图1.9.6
  • 全息视图1.15.4
  • Map绘制库3.7.0

下面是我在尝试你的例子时得到的svg(线宽=2):
two polygons with different edgecolor, third polygon omitted

相关问题