【matplotlib基础】--结合地图

matplotlib,基础,结合,地图 · 浏览次数 : 210

小编点评

**将分析结果结合地图一起展示的方法** **1. 绘制地图** - 获取地理信息:使用 DataV 数据可视化平台获取南京各个区地理范围信息。 - 展示地理信息:使用 matplotlib 库读取地理信息数据并绘制地图。 **2. 数据关联** - 将分析结果与地理信息数据进行关联。 - 以 name 列作为结合两个数据集的依据: - 使用 pandas 中的 merge 函数合并地理信息和业务数据。 **3. 地图上展示数据** - 使用 matplotlib 库绘制热力图或分类展示等地图。 **4. 总结** - 通过结合地理信息,将分析结果更加生动地展现出来。 - 能够展示很多数据分析场景的地理相关性。 **示例代码** ```python import geopandas as gpddf_geo import matplotlib.pyplot as plt # 获取地理信息数据 df_geojson = gpddf_geo.read_file( "https://geo.datav.aliyun.com/areas_v3/bound/320100_full.json" ) # 绘制地图 fig, ax = plt.subplots() ax.axis("off") df.plot(ax=ax, column="value", cmap="plasma", edgecolor="k", legend=True, legend_kwds={"label": "value", "shrink": 0.5}) for index, row in df.iterrows(): if row["name"] in ["建邺区", "鼓楼区", "玄武区", "秦淮区"]: ax.text(row["geometry"]["centroid"]["x"], row["geometry"]["centroid"]["y"], row["name"], ha="center", va="center", fontsize=8) else: ax.text(row["geometry"]["centroid"]["x"], row["geometry"]["centroid"]["y"], row["name"], ha="center", va="center") # 展示地图 plt.show() ```

正文

如果分析的数据与地域相关,那么,把分析结果结合地图一起展示的话,会让可视化的效果得到极大的提升。

比如,分析各省GDP数据,人口数据,用柱状图,饼图之类的虽然都可以展示分析结果,
不过,如果能在全国的地图上展示各省的分析结果的话,会让人留下更加深刻的印象。

将数据的分析结果展示在地图上,难点在于:

  1. 如何绘制地图,地图是展示数据的基础,如何绘制出需要的地图区域是第一步
  2. 数据和地图关联,数据最终要显示在地图上,数据如何与地理坐标关联也是重要的一步
  3. 地图上展示数据,也就是要在地图上绘制不同的颜色或者几何形状来表达不同的数据

解决了上面3个难题,就能够结合地图做一些基本的数据展示了。
本篇通过一个基于南京各个区地理信息的分析示例,来演示如何一步步通过地图来展示分析结果。

1. 绘制地图

第一步是绘制地图,其实地图就是一块块不规则的多边形拼接起来的。
在本篇的示例中,各个多边形就是南京的各个区

绘制多边形不难,难的是如何得到各个多边形的顶点坐标。
好在现在有很多的开放地理信息平台,可以让我们获取到想要的地理信息。

1.1. 获取地理信息

比如,通过阿里的DataV数据可视化平台,可以获取南京各个区的地理范围信息。
image.png
在这个平台上,左边选择区域,右边会生成对应范围的地理信息的数据。
地理信息数据是json格式。

1.2. 展示地理信息

为了读取地理信息数据并展示,需要用到一个 GeoPandas 的库。
pip 安装很简单:

$ pip install geopandas

geopandas可以直接读取DataV数据可视化平台生成的JSON数据并展示。

import geopandas as gpd

df_geo = gpd.read_file(
    "https://geo.datav.aliyun.com/areas_v3/bound/320100_full.json"
)
df_geo

image.png
json文件的HTTP地址DataV数据可视化平台就是在上生成的。
这个文件中的关键字段就是 geometry,其中的内容就是各个区的多边形形状的各个顶点的经纬度坐标。

展示数据:

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()

image.png
其中主要参数的含义:

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

2. 地图和数据关联

首先生成一些测试数据:

# 删除 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_valdf_geo 结合起来。

# 以 name 列作为结合两个数据集的依据
df = pd.merge(df_geo, df_val, on="name", how="left")
df

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

3. 地图上展示数据

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

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()

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

3.2. 分类展示

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

  • value < 3000
  • 3000 <= value < 5000
  • value >= 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<3000"
    )
)


df[(df["value"] >= 3000) & (df["value"] < 5000)].plot(
    ax=ax,
    color="lightgreen",
    edgecolor="k",
    hatch="o",
    legend=False,
)
legend_list.append(
    mpatches.Patch(
        facecolor="lightgreen",
        edgecolor="black", hatch="o", label="3000<=value<5000")
)

df[df["value"] >= 5000].plot(
    ax=ax,
    color="r",
    edgecolor="k",
    hatch="*",
    legend=False,
)
legend_list.append(mpatches.Patch(
    facecolor="r",
    edgecolor="black", hatch="*", label="value>=5000"))

ax.legend(handles = legend_list, 
          loc=(1, 0.5), 
          title="value 等级", 
          fontsize=12)

plt.show()

image.png

4. 总结

结合地理信息展示数据,让数据更加的生动,特别是很多数据分析场景本身就和地理信息密切相关。
除了基于地域的各种经济或者人口等等的相关数据,
还有各类气象数据,如能和地理信息结合展示的话,会让人对整体情况一目了然。

文中用到的主要资源:


与【matplotlib基础】--结合地图相似的内容:

【matplotlib基础】--结合地图

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

【matplotlib基础】--子图

使用Matplotlib对分析结果可视化时,比较各类分析结果是常见的场景。在这类场景之下,将多个分析结果绘制在一张图上,可以帮助用户方便地组合和分析多个数据集,提高数据可视化的效率和准确性。 本篇介绍Matplotlib绘制子图的常用方式和技巧。 1. 添加子图的方式 添加子图主要有两种方式,一种是

【matplotlib基础】--绘图配置

Matplotlib 提供了大量配置参数,这些参数可以但不限于让我们从整体上调整通过 Matplotlib 绘制的图形样式,这里面的参数还有很多是功能性的,和其他工具结合时需要用的配置。 通过plt.rcParams,可以查看所有的配置信息: import matplotlib.pyplot as

【matplotlib基础】--动画

matplotlib的动画一直是一个强大但使用频率不高的功能,究其原因,一方面展示动画需要一定的媒介,没有图形和文字展示方便;二来大家更关心的是分析结果的最终图表,图表的动态展示则没有那么重要。 不过,随着短视频的兴起,在短视频平台上展示动画变得非常容易,所以,我们发现有越来越多的数据分析动画(比如

【matplotlib基础】--画布

Matplotlib 库是一个用于数据可视化和绘图的 Python 库。它提供了大量的函数和类,可以帮助用户轻松地创建各种类型的图表,包括直方图、箱形图、散点图、饼图、条形图和密度图等。 使用 Matplotlib 的过程中,遇到的难点并不在于绘制各类的图形,因为每种图形都有其对应的API。难点在于

【matplotlib基础】--坐标轴

Matplotlib的坐标轴是用于在绘图中表示数据的位置的工具。 坐标轴是图像中的水平和垂直线,它们通常表示为 x 轴和 y 轴。坐标轴的作用是帮助观察者了解图像中数据的位置和大小,通常标有数字或标签,以指示特定的值在图像中的位置。 1. 坐标轴范围 Matplotlib绘制图形时,会自动根据X,Y

【matplotlib基础】--刻度

Matplotlib中刻度是用于在绘图中表示数据大小的工具。 刻度是坐标轴上的数字或标签,用于指示数据的大小或值,通常以整数或小数表示,具体取决于坐标轴的类型和限制。 1. 主次刻度 默认的绘制时,坐标轴只有默认的主要刻度,如下所示: from matplotlib.ticker import Mu

【matplotlib基础】--图例

Matplotlib 中的图例是帮助观察者理解图像数据的重要工具。图例通常包含在图像中,用于解释不同的颜色、形状、标签和其他元素。 1. 主要参数 当不设置图例的参数时,默认的图例是这样的。 import numpy as np import matplotlib.pyplot as plt x =

【matplotlib基础】--文本标注

Matplotlib 文本和标注可以为数据和图形之间提供额外的信息,帮助观察者更好地理解数据和图形的含义。 文本用于在图形中添加注释或提供更详细的信息,以帮助观察者理解图形的含义。标注则是一种更加细粒度的文本信息,可以被用来为特定的数据点或区域提供更详细的信息。 本篇通过示例依次介绍文本和标注的常用

【matplotlib基础】--样式表

Matplotlib库 由于诞生的比较早,所以其默认的显示样式很难符合现在的审美,这也是它经常为人诟病的地方。 不过,经过版本更迭之后,现在 Matplotlib 已经内置了很多样式表,通过使用不同的样式表,可以整体改变绘制图形的风格,不用再调整一个个显示参数。 1. 样式表的使用 1.1. 所有内