Choropleths-第一部分

2023-01-11 13:07 456 阅读 ID:681
磐创AI
磐创AI

到目前为止,在我们的文章系列中,我们一直在讨论如何创建交互式地理图,我们讨论了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

感谢阅读!

免责声明:作者保留权利,不代表本站立场。如想了解更多和作者有关的信息可以查看页面右侧作者信息卡片。
反馈
to-top--btn