饼图和地理数据可视化库GeoPandas地图

6

我想在地图上代表每个区域内的族群分布。

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

我的代码如下:

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

plt.axis('off')

其中 'resid_preto' 是一个包含该地区黑人口比例的列

我想制作像这样的地图。这样,我可以在单个地图上表示所有族群,而不是为每个族群创建一个地图。 enter image description here


我也在尝试实现这个。到目前为止,我发现geopands有kind参数(https://geopandas.org/docs/reference/api/geopandas.GeoDataFrame.plot.html?highlight=pie),但对我来说它不起作用。你找到解决办法了吗? - Arraval
1个回答

3
据我所知,使用geopandas没有直接的方法来实现这一点。但是,结合pyplot中的散点图可以得到所需的结果。
第一个诀窍是获取饼图绘制的x,y坐标。在我的情况下,我使用了geopandascentroid工具和x、y方法,例如,x和y坐标由以下公式给出(i是geopandas DataFrame中的行索引):
centroids = geo_df.centroid
x_coord = centroids.x[i]
y_coord = centroids.y[i]

下一步是使用pyplot创建饼图并存储返回的结构,其中包括饼图楔形的列表。
wedges=plt.pie([1,1,1])

第三步是创建一个绘图对象,然后使用plot API绘制geopandas DataFrame,例如:
fig, ax = plt.subplots(1, 1)
geo_df.boundary.plot(ax=ax,zorder=1,edgecolor='black') 

最后,使用scatter在geopandas图上添加饼图。 for循环是为了添加从plot.pie([1,1,1])获取的3个楔形图(如果有更多楔形图,请更改此内容。必须有一种更有效/优雅的方法来完成此操作):
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()

关键是向scatter传递一个非默认标记,即楔形图案。对于wedges中的每个元素,首先获取路径,然后获取顶点,最后将其转换为列表并作为标记。

太棒了!我需要对整个数据框执行此操作,所以在最后一步中,我将“for j in range”循环嵌套在“df.itertuples()”中,这样我就可以直接为每个数据框行传递xcoord、ycoord和饼图楔形。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接