使用 geopandas 绘制分级着色图

在 Python 中可视化地理空间数据

Mary van Valkenburg

Data Science Program Manager, Nashville Software School

顺序色图示例

在 Python 中可视化地理空间数据

使用 GeoDataFrame.plot() 的分级着色图

districts_with_counts.plot(column = 'school_density', legend = True)
plt.title('每平方十进制度的学校数')
plt.xlabel('经度')
plt.ylabel('纬度');

使用 viridis 色图的学校密度分级着色图

在 Python 中可视化地理空间数据

使用 GeoDataFrame.plot() 的分级着色图

districts_with_counts.plot(column = 'school_density', cmap = 'BuGn', edgecolor = 'black', legend = True)
plt.title('每平方十进制度的学校数')
plt.xlabel('经度')
plt.ylabel('纬度');

蓝绿色色图的学校密度分级着色图

在 Python 中可视化地理空间数据

以平方千米计算面积

# starting CRS
print(school_districts.crs)
epsg:4326
# convert to EPSG 3857
school_districts = school_districts.to_crs(epsg = 3857)
print(school_districts.crs)
epsg:3857
在 Python 中可视化地理空间数据

以平方千米计算面积

# define a variable for m^2 to km^2
sqm_to_sqkm = 10**6

school_districts['area'] = school_districts.area / sqm_to_sqkm
school_districts.head(2)
district    geometry                             area
1          (POLYGON ((-965.055 4353528.766...    563.134380
3          (POLYGON ((-965.823 4356392.677...    218.369949
在 Python 中可视化地理空间数据
# change crs back to 4326
school_districts = school_districts.to_crs(epsg = 4326)
print(school_districts.crs)
epsg:4326
print(school_districts.head(2))
district      geometry                       area
1             (POLYGON ((-86.771 36.383...   563.134380
3             (POLYGON ((-86.753 36.404...   218.369949
# spatial join to get districts that contain schools
schools_in_districts = gpd.sjoin(school_districts, schools_geo, predicate = 'contains')
在 Python 中可视化地理空间数据
# aggregate to get counts
school_counts = schools_in_districts.groupby(['district']).size()
# convert school_counts to a df 
school_counts_df = school_counts.to_frame()
school_counts_df = school_counts_df.reset_index(level=0)
school_counts_df.columns = ['district', 'school_count']
# merge
districts_with_counts = pd.merge(school_districts,
                                 school_counts_df, on = 'district')
districts_with_counts.head(1)
district  geometry                       area       school_count
1         (POLYGON ((-86.771 36.383..    563.134380    30
在 Python 中可视化地理空间数据

计算学校密度

# create school_density
districts_with_counts['school_density'] = districts_with_counts.apply(
    lambda row: row.school_count/row.area, axis = 1)
# plot it
districts_with_counts.plot(column = 'school_density', cmap = 'BuGn', 
                           edgecolor = 'black', legend = True)
plt.title('每平方千米的学校数')
plt.xlabel('经度')
plt.ylabel('纬度')
plt.show();
在 Python 中可视化地理空间数据

每平方千米学校密度的分级着色图

在 Python 中可视化地理空间数据

¡Vamos a practicar!

在 Python 中可视化地理空间数据

Preparing Video For Download...