翼度科技»论坛 编程开发 python 查看内容

【matplotlib基础】--结合地图

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
如果分析的数据与地域相关,那么,把分析结果结合地图一起展示的话,会让可视化的效果得到极大的提升。
比如,分析各省GDP数据,人口数据,用柱状图,饼图之类的虽然都可以展示分析结果,
不过,如果能在全国的地图上展示各省的分析结果的话,会让人留下更加深刻的印象。
将数据的分析结果展示在地图上,难点在于:

  • 如何绘制地图,地图是展示数据的基础,如何绘制出需要的地图区域是第一步
  • 数据和地图关联,数据最终要显示在地图上,数据如何与地理坐标关联也是重要的一步
  • 地图上展示数据,也就是要在地图上绘制不同的颜色或者几何形状来表达不同的数据
解决了上面3个难题,就能够结合地图做一些基本的数据展示了。
本篇通过一个基于南京各个区地理信息的分析示例,来演示如何一步步通过地图来展示分析结果。
1. 绘制地图

第一步是绘制地图,其实地图就是一块块不规则的多边形拼接起来的。
在本篇的示例中,各个多边形就是南京的各个区
绘制多边形不难,难的是如何得到各个多边形的顶点坐标。
好在现在有很多的开放地理信息平台,可以让我们获取到想要的地理信息。
1.1. 获取地理信息

比如,通过阿里的DataV数据可视化平台,可以获取南京各个区的地理范围信息。

在这个平台上,左边选择区域,右边会生成对应范围的地理信息的数据。
地理信息数据是json格式。
1.2. 展示地理信息

为了读取地理信息数据并展示,需要用到一个 GeoPandas 的库。
用 pip 安装很简单:
  1. $ pip install geopandas
复制代码
geopandas可以直接读取DataV数据可视化平台生成的JSON数据并展示。
  1. import geopandas as gpd
  2. df_geo = gpd.read_file(
  3.     "https://geo.datav.aliyun.com/areas_v3/bound/320100_full.json"
  4. )
  5. df_geo
复制代码

json文件的HTTP地址DataV数据可视化平台就是在上生成的。
这个文件中的关键字段就是 geometry,其中的内容就是各个区的多边形形状的各个顶点的经纬度坐标。
展示数据:
  1. import matplotlib.pyplot as plt
  2. fig, ax = plt.subplots()
  3. fig.set_size_inches(8, 8)
  4. # df_geo就是上面通过geopandas读取的数据
  5. df_geo.plot(
  6.     ax=ax,
  7.     column="name",
  8.     cmap="plasma",
  9.     edgecolor="k",
  10.     legend=True,
  11.     legend_kwds={"loc": "lower left"}
  12. )
  13. plt.show()
复制代码

其中主要参数的含义:

  • ax:matplotlib生成的子图,这里就是数据要绘制的位置
  • column:作为不同区域的名称,这里就是南京各个区的名称
  • cmap:一组颜色,分别对应不同的区
  • edgecolor:每个多边形边缘的颜色,这里设置的是黑色
  • legend:是否显示图例
  • legend_kwds:设置图例的配置信息,这里只设置了图例的位置
2. 地图和数据关联

首先生成一些测试数据:
  1. # 删除 df_geo 中一些不必要的列
  2. df_geo = df_geo.drop(columns=["childrenNum", "level", "parent", "subFeatureIndex"])
  3. # 南京各个区的名称
  4. area_names = df_geo.loc[:, "name"]
  5. # df_val为测试数据,其中name列是各个区的名称
  6. # value 列是一些随机数,模拟各个区的人口,GDP等数据
  7. df_val = pd.DataFrame({
  8.     "name": area_names.tolist(),
  9.     "value": np.random.randint(10, 10000, len(area_names))
  10. })
复制代码
测试数据 df_val 模拟其他途径得到的业务数据,
下面要将 df_val 中的指展示到地图上,就要先把 df_val 和 df_geo 结合起来。
  1. # 以 name 列作为结合两个数据集的依据
  2. df = pd.merge(df_geo, df_val, on="name", how="left")
  3. df
复制代码

这样,我们就得到了同时包含地理信息(geometry)业务数据(value)的数据集了。
3. 地图上展示数据

接下来就是展示数据了,下面演示两种在地图上展示数据的方式。
3.1. 热力图方式

根据 value 值的不同,用渐变色来显示不同区的颜色。
  1. fig, ax = plt.subplots()
  2. fig.set_size_inches(8, 8)
  3. ax.axis("off")
  4. df.plot(
  5.     ax=ax,
  6.     column="value",
  7.     cmap="plasma",
  8.     edgecolor="k",
  9.     legend=True,
  10.     legend_kwds={'label': "value", 'shrink':0.5},
  11. )
  12. for index in df.index:
  13.     x = df.iloc[index].geometry.centroid.x
  14.     y = df.iloc[index].geometry.centroid.y
  15.     name = df.iloc[index]["name"]
  16.     if name in ["建邺区", "鼓楼区", "玄武区", "秦淮区"]:
  17.         ax.text(x, y, name, ha="center", va="center", fontsize=8)
  18.     else:
  19.         ax.text(x, y, name, ha="center", va="center")
  20. plt.show()
复制代码

其中,"建邺区", "鼓楼区", "玄武区", "秦淮区" 四个区的面积比较小,
所以字体稍微调小了一些。
3.2. 分类展示

把 value值分为3类,每类用不同的形式来表示。

  • value < 3000
  • 3000  = 5000
[code]import matplotlib.patches as mpatchesfig, 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具