到目前为止,在我们的文章系列中,我们一直在讨论如何创建交互式地理图,我们讨论了7个选项,涵盖了根据首选的易用性和可定制性可以使用的各种工具。
与地理地图相比,choropeth的选项更少,因此在我们的文章系列中,我们甚至会包括非交互式的选项。
对于这一部分,让我们用我们拥有的最基本的工具来尝试一下:Geopandas。
CHOROPLETHS
首先,Choropleth(有时称为颜色主题)是一种使用色阶(颜色强度)表示区域值的主题地图。我们使用区域一词是因为它通常对应于一个行政位置(城市、省份和国家)。
因此,创建choropeth贴图需要存在形状文件。
颜色越强烈(在色阶光谱的右侧),表示的区域值越大。例如,对于“绿色”这样的顺序色阶/颜色贴图,绿色的深浅表示更大的值。
那么,你什么时候更喜欢使用choropeth而不是geoscaterplot?
Choropleth用于比较区域之间的聚合值。这可能是某些值或统计的平均值、中值、最小值或最大值。另一方面,geoscaterplot代表单个观测值的分散,而不是总体观测值。
如果使用图例,它可以用来比较单个观察结果(就像我们的咖啡店案例)。
让我们尝试对各国的人均GDP使用choropleth绘图,使用choopleth的好处是,我们将立即看到人均GDP较高的国家是否表现出地理位置的接近性。
现在让我们继续编码。
预备工作
数据的加载和预处理
对于我们的数据集,我们将使用世界银行数据库中的人均GDP数据集(2015年不变美元)。
环境
要安装和使用的最重要的软件包是geopandas。根据我的经验,在Macbook上安装这个很容易,但在Windows上安装有点困难。在这种情况下,我准备了一篇文章,可能会对你有所帮助。
出于我们的目的,我们同样需要安装pyproj和mapclassification。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import geopandas as gpd
%matplotlib inline
加载形状文件
对于本系列中所有的Choropleth,我们将需要制作Choropleth区域的形状文件。形状文件提供了一个位置的行政边界,可以像省、市或某些自定义区域一样详细。
由于我们需要绘制的信息是针对国家的,因此我们将使用具有国家级的世界形状文件。
形状文件可以从GADM下载:https://gadm.org/data.html
编码
### LOAD GDP PER CAPITA DATA
df = pd.read_csv('data/gdp_per_capita.csv',
skiprows=4)
df = df.loc[:,['Country Name','Country Code', '2020']] #Choose only 2020
df.head()
### LOAD THE SHAPEFILES
gdf = gpd.read_file('shapefiles/world-administrative-boundaries/world-administrative-boundaries.shp')
gdf.head()
### MERGE DATA
merged = gdf.merge(df, left_on='name', right_on='Country Name' )
merged.head()
重要:并非所有国家/地区都将使用与形状文件相同的名称,因此同步名称的工作对此非常重要
### PLOT
cmap = 'Greens'
#Create A Figure to Attach Other Objects Later
fig, ax = plt.subplots(figsize = (30,25))
merged.plot(column="2020",
ax=ax,
cmap=cmap,
# k=colors,
scheme='quantiles',
legend=True)
ax.axis('off')
关于我们的代码的一些事情:
- cmap-颜色映射。
- fig,ax-如果我们希望创建颜色条(这是我们用于颜色贴图的图例),这一部分很重要
- scheme-上面的scheme参数要求我们安装mapclassification。这有助于我们更好地分配颜色贴图,而不是手动决定贴图将使用的颜色数量。在大多数情况下,这是有帮助的,因为太多的颜色可能很难处理。
- axis。axis('off')-这是用于删除与地理代码对应的x轴和y轴的代码。
定制
为了进一步改进我们的地图,我们可以:
- 添加颜色条
- 选择其他配色方案
- 为人均收入超过100000美元的人添加文本
colorbar
颜色条是帮助确定与颜色或颜色阴影相关的可能值范围的图例。
# create the colorbar
norm = colors.Normalize(vmin=merged['2020'].min(), vmax=merged['2020'].max())
cbar = plt.cm.ScalarMappable(norm=norm, cmap='Greens')
COLORMAPS
要真正显示对比度,最好使用发散的颜色贴图。在这种情况下,让我们试试RdYlGn:
#Try a diverging colormap
cmap = 'RdYlGn'
#Create A Figure to Attach Other Objects Later
fig, ax = plt.subplots(figsize = (30,25))
merged.plot(column="2020",
ax=ax,
cmap=cmap,
# k=colors,
scheme='quantiles',
legend=True)
# ax.legend(loc="best")
ax.axis('off')
# create the colorbar
norm = colors.Normalize(vmin=merged['2020'].min(), vmax=merged['2020'].max())
cbar = plt.cm.ScalarMappable(norm=norm, cmap=cmap)
cax = fig.add_axes([1, 0.1, 0.03, 0.8])
cbr = fig.colorbar(cbar, cax=cax,)
#Remove the legend
ax.get_legend().remove()
#Change the tick for the colorbar
cax.tick_params(labelsize=18)
fig
增加人均10万美元以上的文本
与其他定制相比,这种定制不那么容易美化,但为了那些想要它的人,让我们继续把它放在这里。
要添加文本,我们需要将其放置在几何体(或质心)的中心。这样做的问题是,一些几何图形比其他几何图形小,因此不容易调整文本大小。
for ind, row in merged.iterrows():
if merged.loc[ind,'2020']>100000:
ax.text(row["geometry"].centroid.x,row["geometry"].centroid.y+4, row["name"], fontsize=12, color='blue',weight="bold")
ax.text(row["geometry"].centroid.x,row["geometry"].centroid.y, row["2020"],
fontsize=12, color='blue', weight='bold')
fig
最后
正如我们所看到的,choropleth确实回答了我们最初的问题:人均GDP水平确实聚集在一起,我们看到富裕国家彼此接近,而贫穷国家(就人均GDP而言)也是如此。
好消息是,对于我们将要测试的后续包,将使用我们在这里已经拥有的基本代码,因为大多数包都需要形状文件(或geopandas数据帧)。
我的Github页面上的完整代码:
https://github.com/francisadrianviernes/GeoVisualization/blob/master/The%20Battle%20of%20Choropleths%E2%80%8A-%E2%80%8APart%C2%A01.ipynb
感谢阅读!