为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 GeoJSONDataSource 和 CategoricalColorMapper

如何使用 GeoJSONDataSource 和 CategoricalColorMapper

UYOU 2021-11-16 15:32:52
我正在尝试为散景补丁图添加一个图例,但我最终只有一个图例项(并且标签错误)。我有一个多边形的形状文件。每个多边形都有一个名为“类别”的属性,它可以取值“A”、“B”、“C”、“D”和“E”。我将形状文件转换为 geojson 并随后创建一个散景图块图,使用 CategoricalColorMapper 根据它所在的“类别”为每个多边形添加颜色。现在我希望图例显示五个类别选项及其各自的颜色。这是我的代码:import geopandas as gpdfrom bokeh.io import show, output_notebook, output_file, export_pngfrom bokeh.models import GeoJSONDataSource, CategoricalColorMapper, Legend, LegendItemfrom bokeh.plotting import figure, reset_outputfrom bokeh.transform import factor_cmapimport seleniumimport numpy as npgdf = gpd.GeoDataFrame.from_file("test.shp")gdf_json = gdf.to_json()source_shape = GeoJSONDataSource(geojson=gdf_json)cmap = CategoricalColorMapper(palette=["black", "purple", "pink", "brown", "blue"], factors=['A','B','C','D', 'E'])p = figure(height=500, match_aspect=True,    h_symmetry=False, v_symmetry=False, min_border=0)p.patches('xs', 'ys', source=source_shape, fill_color={'field': 'category', 'transform': cmap},             line_color='black', line_width=0.5, legend='category')export_png(p, filename="map.png")但是,我得到的输出如下: map.png output图例仅显示一项,带有标签“类别”而不是实际类别名称。我该如何解决这个问题,以便图例显示所有 5 个类别及其标签(A、B、C、D、E)?
查看完整描述

2 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

这段代码可以满足您的要求,但是,我认为GeoDataFrame直接操作而不是转换为JSON. 此代码与 Bokeh v1.0.4 兼容。


from bokeh.models import GeoJSONDataSource, CategoricalColorMapper

from bokeh.plotting import figure, show

from bokeh.io import export_png

import geopandas as gpd

import random

import json


gdf = gpd.GeoDataFrame.from_file("Judete/Judete.shp")

gdf_json = gdf.to_json()

gjson = json.loads(gdf_json)


categories = ['A', 'B', 'C', 'D', 'E']

for item in gjson['features']:

    item['properties']['category'] = random.choice(categories)


source_shapes = {}

for category in categories:

    source_shapes[category] = {"type": "FeatureCollection", "features": []}


for item in gjson['features']:

    source_shapes[item['properties']['category']]['features'].append(item)


p = figure(match_aspect = True, min_border = 0,

           h_symmetry = False, v_symmetry = False,

           x_axis_location = None, y_axis_location = None)


cmap = CategoricalColorMapper(palette = ["orange", "purple", "pink", "brown", "blue"], 

                              factors = ['A', 'B', 'C', 'D', 'E'])

for category in categories:

    source_shape = GeoJSONDataSource(geojson = json.dumps(source_shapes[category]))

    p.patches('xs', 'ys', fill_color = {'field': 'category', 'transform': cmap},

                          line_color = 'black', line_width = 0.5,

                          legend = category, source = source_shape,)

p.legend.click_policy = 'hide'

show(p) # export_png(p, filename = "map.png")

结果:

//img1.sycdn.imooc.com//61935ee2000134fb04030294.jpg

查看完整回答
反对 回复 2021-11-16
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

似乎图例当前不与 GeoJSONDataSource 一起使用,因为存在一个未解决的未解决问题Legend 不与 GeoJSONDataSource #5904 一起使用


查看完整回答
反对 回复 2021-11-16
  • 2 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信