【matplotlib基础】 | 您所在的位置:网站首页 › 地图组合 › 【matplotlib基础】 |
如果分析的数据与地域相关,那么,把分析结果结合地图一起展示的话,会让可视化的效果得到极大的提升。 比如,分析各省GDP数据,人口数据,用柱状图,饼图之类的虽然都可以展示分析结果,不过,如果能在全国的地图上展示各省的分析结果的话,会让人留下更加深刻的印象。 将数据的分析结果展示在地图上,难点在于: 如何绘制地图,地图是展示数据的基础,如何绘制出需要的地图区域是第一步 数据和地图关联,数据最终要显示在地图上,数据如何与地理坐标关联也是重要的一步 地图上展示数据,也就是要在地图上绘制不同的颜色或者几何形状来表达不同的数据解决了上面3个难题,就能够结合地图做一些基本的数据展示了。本篇通过一个基于南京各个区地理信息的分析示例,来演示如何一步步通过地图来展示分析结果。 1. 绘制地图第一步是绘制地图,其实地图就是一块块不规则的多边形拼接起来的。在本篇的示例中,各个多边形就是南京的各个区。 绘制多边形不难,难的是如何得到各个多边形的顶点坐标。好在现在有很多的开放地理信息平台,可以让我们获取到想要的地理信息。 1.1. 获取地理信息比如,通过阿里的DataV数据可视化平台,可以获取南京各个区的地理范围信息。 为了读取地理信息数据并展示,需要用到一个 GeoPandas 的库。用 pip 安装很简单: $ pip install geopandasgeopandas可以直接读取DataV数据可视化平台生成的JSON数据并展示。 import geopandas as gpd df_geo = gpd.read_file( "https://geo.datav.aliyun.com/areas_v3/bound/320100_full.json" ) df_geo
展示数据: import matplotlib.pyplot as plt fig, ax = plt.subplots() fig.set_size_inches(8, 8) # df_geo就是上面通过geopandas读取的数据 df_geo.plot( ax=ax, column="name", cmap="plasma", edgecolor="k", legend=True, legend_kwds={"loc": "lower left"} ) plt.show()
首先生成一些测试数据: # 删除 df_geo 中一些不必要的列 df_geo = df_geo.drop(columns=["childrenNum", "level", "parent", "subFeatureIndex"]) # 南京各个区的名称 area_names = df_geo.loc[:, "name"] # df_val为测试数据,其中name列是各个区的名称 # value 列是一些随机数,模拟各个区的人口,GDP等数据 df_val = pd.DataFrame({ "name": area_names.tolist(), "value": np.random.randint(10, 10000, len(area_names)) })测试数据 df_val 模拟其他途径得到的业务数据,下面要将 df_val 中的指展示到地图上,就要先把 df_val 和 df_geo 结合起来。 # 以 name 列作为结合两个数据集的依据 df = pd.merge(df_geo, df_val, on="name", how="left") df
接下来就是展示数据了,下面演示两种在地图上展示数据的方式。 3.1. 热力图方式根据 value 值的不同,用渐变色来显示不同区的颜色。 fig, ax = plt.subplots() fig.set_size_inches(8, 8) ax.axis("off") df.plot( ax=ax, column="value", cmap="plasma", edgecolor="k", legend=True, legend_kwds={'label': "value", 'shrink':0.5}, ) for index in df.index: x = df.iloc[index].geometry.centroid.x y = df.iloc[index].geometry.centroid.y name = df.iloc[index]["name"] if name in ["建邺区", "鼓楼区", "玄武区", "秦淮区"]: ax.text(x, y, name, ha="center", va="center", fontsize=8) else: ax.text(x, y, name, ha="center", va="center") plt.show()
把 value值分为3类,每类用不同的形式来表示。 value < 3000 3000 = 5000 import matplotlib.patches as mpatches fig, ax = plt.subplots() fig.set_size_inches(5, 10) ax.axis("off") legend_list = [] df[df["value"] < 3000].plot( ax=ax, color="lightblue", edgecolor="k", hatch="\\\\", legend=False, ) legend_list.append( mpatches.Patch( facecolor="lightblue", edgecolor="black", hatch="\\\\", label="value |
CopyRight 2018-2019 实验室设备网 版权所有 |