饼图和 geopandas 地图

Luc*_*cas 7 python geopandas

我想表示地图每个区域内的种族分布。

我是 geopandas 的新手,到目前为止,我只能制作一张地图,按地区显示单个民族的份额。

我的代码如下:

geodf.plot(column="resid_preto", cmap="Blues", figsize=(20,12), 
edgecolor='black', linewidth=0.5, alpha=0.9, legend=False)

plt.axis('off')
Run Code Online (Sandbox Code Playgroud)

其中“resid_preto”是包含该地区黑人人口比例的列

我想做一张像这样的地图。因此,我可以在一张地图中代表所有种族群体,而不是为每个群体创建一张地图 在此输入图像描述

Arr*_*val 4

AFAIK 没有直接的方法可以做到这一点geopandas。但将其与来自pyplot所需结果的散射相结合可以获得。

第一个技巧是获取x,y要绘制饼图的坐标。在我的例子中,我使用了x 和 y 方法centroid的工具,例如,x 和 y 坐标由(是 geopandas DataFrame 中的行索引)geopandas给出:i

centroids = geo_df.centroid
x_coord = centroids.x[i]
y_coord = centroids.y[i]
Run Code Online (Sandbox Code Playgroud)

下一步是使用 pyplot 创建饼图并存储返回的结构,其中包括带有饼图楔形的补丁列表等:

wedges=plt.pie([1,1,1])
Run Code Online (Sandbox Code Playgroud)

第三步是创建一个绘图对象,然后使用绘图 API绘制 geopandas DataFrame ,例如,

fig, ax = plt.subplots(1, 1)
geo_df.boundary.plot(ax=ax,zorder=1,edgecolor='black') 
Run Code Online (Sandbox Code Playgroud)

最后,使用 scatter 将饼图添加到 geopandas 图的顶部。该for循环是添加从以下获得的 3 个楔形中的每一个plot.pie([1,1,1])(如果有更多楔形,只需更改此设置。必须有一种更有效/优雅的方法来执行此操作):

piecolor=['b','g','y']
for j in range(3):
 ax.scatter([x_coord],[y_coord],marker=(wedges[0][j].get_path().vertices.tolist()),facecolor=piecolors[j], s=800)
plt.show()
Run Code Online (Sandbox Code Playgroud)

诀窍是将非默认标记传递给scatter,在本例中为楔形。对于其中的每个元素,wedges首先获取路径,然后获取顶点,最后将其转换为列表,这就是标记。