【问题标题】:Issue with creating choropleth map on Python在 Python 上创建等值线图的问题
【发布时间】:2020-11-30 03:38:45
【问题描述】:

我正在尝试在 python 上使用 folium 创建一个等值线地图,并且能够运行基本地图,但是当我尝试添加具有邻域边界的图层时,它不会显示在 html 页面上。我想也许我必须增加线条的不透明度,但似乎不是这样。

这是我的代码:

import folium
    import pandas as pd
    
    crimeData = pd.read_csv('NYC_crime.csv')
    crime2020 = crimeData[crimeData.CMPLNT_FR_DT == 2020]
    
    nycMap = folium.Map(location=[40.693943, -73.985880],zoom_start = 10)
    mapLines = 'nbhdMap.geojson.json'
    
    folium.Choropleth(geo_data = mapLines,
                      data = crime2020,
                      fill_color = 'OrRd',
                      fill_opacity=0.5,
                      line_opacity=1.0,
                      key_on = 'feature.geometry.coordinates',
                      columns = ['Lat_Lon']
                      )
    
    nycMap.save(outfile='index.html')

我也无法用数据填充地图。我正在努力做到这一点,以便使用 2020 年 CSV 文件中记录的每个投诉来显示哪些区域接到的电话最多。但我得到这个错误:

Traceback (most recent call last):
  File "/Users/kenia/Desktop/CSCI233/PRAC.py", line 10, in <module>
    folium.Choropleth(geo_data = mapLines,
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/folium/features.py", line 1158, in __init__
    color_data = data.set_index(columns[0])[columns[1]].to_dict()
IndexError: list index out of range

这是社区边界:https://data.beta.nyc/dataset/pediacities-nyc-neighborhoods/resource/35dd04fb-81b3-479b-a074-a27a37888ce7

这是我的数据:https://data.cityofnewyork.us/Public-Safety/NYPD-Complaint-Data-Current-Year-To-Date-/5uac-w243


[编辑] 所以我用更简单的数据集尝试了@r-beginners 的建议:https://data.cityofnewyork.us/Health/Restaurants-rolled-up-/59dk-tdhz

import pandas as pd
import folium 

data = pd.read_csv('nycrestaurants.csv')
data = pd.concat([data, str(data['ZIPCODE']).split(',')], axis=1)
data.columns = ['CAMIS', 'DBA', 'BORO', 'BUILDING', 'STREET', 'ZIPCODE']
resData = data.groupby(['ZIPCODE'])['DBA'].sum().reset_index()


nycMap = folium.Map(location=[40.693943, -73.985880],zoom_start = 10)
mapLines = 'zipMap.geojson.json'

folium.Choropleth(geo_data = mapLines,
                  data = resData,
                  key_on = 'feature.properties.postalCode',
                  columns = ['ZIPCODE', 'DBA'],
                  fill_color = 'OrRd',
                  fill_opacity=0.5,
                  line_opacity=1.0
                  ).add_to(nycMap)

nycMap.save(outfile='index.html')

但现在我收到此错误消息:

Traceback (most recent call last):
  File "/Users/kenia/Desktop/CSCI233/PRAC.py", line 5, in <module>
    data = pd.concat([data, str(data['ZIPCODE']).split(',')], axis=1)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pandas/core/reshape/concat.py", line 274, in concat
    op = _Concatenator(
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pandas/core/reshape/concat.py", line 359, in __init__
    raise TypeError(msg)
TypeError: cannot concatenate object of type '<class 'list'>'; only Series and DataFrame objs are valid

【问题讨论】:

  • 报错原因是'DBA'列是字符串,无法求和。
  • 假设我们计算 DBA 的数量 (.count()),现在我们需要一个 postalCode 在 JSON 文件端。
  • 'zipMap.geojosn.json'中的数据在哪里?

标签: python keyerror folium choropleth


【解决方案1】:

由于您在另一个问题中看到了投诉数据,因此您从here 获得了相应邮政编码范围的 GEOJSON 数据。至于过程,我们按照邮政编码的数量将其制成表格,并将其与出现的次数联系起来。

import pandas as pd
import numpy as np

df = pd.read_csv('./data/311_Noise_Complaints.csv', sep=',')
df['Incident Zip'].fillna(0, inplace=True)
df['Incident Zip'] = df['Incident Zip'].astype(int)
df_zip = df['Incident Zip'].value_counts().to_frame().reset_index()
df_zip.columns = ['postal_code', 'counts']
df_zip['postal_code'] = df_zip['postal_code'].astype(str)

import folium

nycMap = folium.Map(location=[40.693943, -73.985880], zoom_start=10)
mapLines = './data/nyc_zip_code_tabulation_areas_polygons.geojson'

choropleth = folium.Choropleth(geo_data = mapLines,
                  data = df_zip,
                  columns = ['postal_code', 'counts'],
                  key_on = 'feature.properties.postalcode',
                  fill_color = 'BuPu',
                  fill_opacity=0.5,
                  line_opacity=1.0
                  ).add_to(nycMap)

choropleth.geojson.add_child(
    folium.features.GeoJsonTooltip(['po_name'], labels=False)
)

nycMap.save(outfile='index.html')
nycMap

【讨论】:

  • @ r-beginners 我用你建议的新代码行尝试了它,但我一直收到类型错误。我编辑了我的原始帖子以使用更简单的数据集显示我的代码。
  • 由于您在另一个问题中提供了投诉数据,因此我查找了邮政编码的 GEOJSON 文件并更新了所有答案。请检查内容。
  • 非常感谢!!对于代码并花时间查看我的两个问题。我将不得不检查代码/每个函数以完全理解它的工作原理和原因。现在,如果我可以贪婪,你介意再帮我做一件事吗?我正在尝试使用 GeoJson 文件中的 PO_NAME 列向每个区域添加弹出文本,但即使更改数据类型,我也会不断收到 TypeError。
  • 这是我的代码:for x in mapLines: mapLines['PO_NAME'] = mapLines['PO_NAME'].astype(int) nbhd = mapLines['PO_NAME'] mapLines.add_child(folium.Popup(nbhd)) mapLines.add_to(nycMap),这是错误:Traceback (most recent call last): File "/Users/kenia/Desktop/CSCI233/PRAC.py", line 20, in &lt;module&gt; mapLines['PO_NAME'] = mapLines['PO_NAME'].astype(int) TypeError: string indices must be integers
  • 对不起,奇怪的间距^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 2021-07-21
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多