在folium choropleth GeoJSON多边形中,将文本作为工具提示、弹出窗口或标签。

8
Folium允许创建带有工具提示或弹出文本的标记。我想用我的GeoJSON多边形做同样的事情。
我的GeoJSON有一个名为“name”的属性(feature.properties.name -> 假设它是每个美国州的名称)。除了每个州的失业率外,我还想在我的区域分级地图中显示它作为标签。我在pandas dataframe的"State"列中也有相同的信息。
这是否可能?我将满意一种解决方案,使其成为弹出窗口、工具提示或简单文本标签。
import pandas as pd


url = (
    "https://raw.githubusercontent.com/python-visualization/folium/master/examples/data"
)
state_geo = f"{url}/us-states.json"
state_unemployment = f"{url}/US_Unemployment_Oct2012.csv"
state_data = pd.read_csv(state_unemployment)

m = folium.Map(location=[48, -102], zoom_start=3)

folium.Choropleth(
    geo_data=state_geo,
    name="choropleth",
    data=state_data,
    columns=["State", "Unemployment"],
    key_on="feature.id",
    fill_color="YlGn",
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name="Unemployment Rate (%)",
).add_to(m)

folium.LayerControl().add_to(m)

m
2个回答

14

以前我曾经使用folium的GeoJsonTooltip()和其他步骤来完成这个任务。 我很想知道是否有更好的方法。

  1. 捕获Choropleth函数的返回值
  2. 将一个值(例如失业率)添加到Choropleth的底层geojson对象中
  3. 使用步骤2中的值创建GeoJsonTooltip
  4. 将该提示工具添加到Choropleth的geojson中
url = (
      "https://raw.githubusercontent.com/python-visualization/folium/master/examples/data"
  )
  state_geo = f"{url}/us-states.json"
  state_unemployment = f"{url}/US_Unemployment_Oct2012.csv"
  state_data = pd.read_csv(state_unemployment)
  
  m = folium.Map(location=[48, -102], zoom_start=3)
  
  # capturing the return of folium.Choropleth()
  cp = folium.Choropleth(
      geo_data=state_geo,
      name="choropleth",
      data=state_data,
      columns=["State", "Unemployment"],
      key_on="feature.id",
      fill_color="YlGn",
      fill_opacity=0.7,
      line_opacity=0.2,
      legend_name="Unemployment Rate (%)",
  ).add_to(m)
  
  # creating a state indexed version of the dataframe so we can lookup values
  state_data_indexed = state_data.set_index('State')
  
  # looping thru the geojson object and adding a new property(unemployment)
  # and assigning a value from our dataframe
  for s in cp.geojson.data['features']:
      s['properties']['unemployment'] = state_data_indexed.loc[s['id'], 'Unemployment']
  
  # and finally adding a tooltip/hover to the choropleth's geojson
  folium.GeoJsonTooltip(['name', 'unemployment']).add_to(cp.geojson)
  
  folium.LayerControl().add_to(m)
  
  m

输入图像描述


有没有办法为工具提示添加样式? - G. Macia
1
是的 https://python-visualization.github.io/folium/modules.html#folium.features.GeoJsonTooltip - Bob Haffner

0
Bob的解决方案很有效。有两点需要注意:
1. 为了使其正常工作,您需要在数据表(这里是groupValues)中为folium.Choropleth定义中指定的geo_data=表(这里是counties)中的所有条目都提供值。
cp = folium.Choropleth(
        geo_data = counties,
        name = 'choropleth',
        data = groupValues, 
etc.

如果geo_data表中的某个条目缺少data table中相应的值,则循环将引发KeyError。为解决此问题,我创建了一个循环,使用try . . . except来向geojson表添加正确的值。
第二点,我成功向cp.geojson表添加了数值数据(float64),并且folium允许我使用GeoJsonTooltip和LayerControl进行添加,但是当我尝试显示地图时,出现了"float64 data cannot be serialized"错误。我通过在将其添加到cp.geojson表之前将其转换为字符串来解决了这个问题。
工作循环如下:
for row in cp.geojson.data['features']:
    try:
        row['properties']['PctAllPop'] = str(groupValues.loc[row['properties']['FIPS'],'PctAllPop'])
    except KeyError:
        row['properties']['PctAllPop'] = 'No adherents'
    
folium.GeoJsonTooltip(['NAME','PctAllPop'],aliases=['County:','Pct total pop:']).add_to(cp.geojson)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接