使用python为包含时间序列信息的散点图加上翅膀

首页 / 科技区 / 正文

散点图用两组变量在平面坐标系上构成多个坐标点,通过考察这些点的分布可以帮助判断两变量之间是否存在某种关联或相关关系。例如挖掘模型模拟与实测数据的关系等。那么,如果想借助散点图探求两个变量多个年份的分布状况,以及探求随着时间的推移,这二个变量之间将存在着怎样的路径移动,又该怎么实现呢?这里的重点在于怎样去表达第三个“时间”维度的变量信息。我在近期对这个问题进行了一些有趣的探索,在此分享给大家。

将时间单独作为一维,绘制三维散点图

将时间信息单独作为一维是最直观的想法,就是让三个变量的信息分别展示在 X、Y、Z 三个轴上。不过,我本人并不是很喜欢三维图表,因为我觉得它们不清晰也不直观,尤其是人眼是难以准确辨识 3D 空间投影在二维平面中点的位置,例如下图,很难分辨出每个点的坐标信息:

image-20221101115713000

因此在这里不对此思路进行具体实现。如果一定要这样绘图的话,可以采用类似下面的语句:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x, y, z)

将时间直接标注,引入距离与区间

将时间信息直接标注在点的旁边,这是另一个很自然的想法。当数据点较少时,这种方法往往比较适用。下面的两个例图就给出了两种不同的思路,其中,图一通过引入θ角来判断某地可持续性的“实际发展方向”与“理想发展方向”之间的偏移程度,这里所关注的点位就不再是散点的分布情况,而是不同年份对应数据点的“移动路径”了。通过这种方法,可以巧妙得在二维平面中展现了不同年份这两个变量的变化规律。

图二是很早之前自己想出来的一个草图,它既能够展示散点的“移动路径”,也划分了不同的象限。这里划定象限的灵感来自于“GE矩阵”与“Bivariate map”。对于一些具有特定含义的两个变量的指标,采用这种方法划定象限将有助于厘清认知。例如,假设 X 轴代表“开发水平”,Y 轴代表“生态水平”,将两个变量的状态分别抽象成高、中、低水平,再结合上对不同年份散点“先沿正对角线、后沿负对角线”的路径说明,这张图包含的丰富信息就可以很清晰直观地被说明出来了。


时间散点路径
类似GE矩阵

下面这幅图是一个 Bivariate map 的案例,重点是它右上角的图例,在两个维度上用不同颜色展示了信息。

左边是 choropleth map(中文翻译似乎叫“等值线图”),右边是 dasymetric map(似乎没有贴切的中文翻译)。右边的图用来在地图上更精确地展示数据的实际分布情况,常用于人口密度。因为老是忘记这个 dasymetric map 的含义,在此顺便记录一下。

featured

在散点旁使用 label 标注时间信息,以及绘制不同颜色区间很简单,上面图 2 的代码如下所示:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

df = pd.read_excel('data.xlsx')
x = df['X']
y = df['Y']

fig = plt.figure(dpi=120, figsize=(6,6))
ax = fig.add_subplot(111)

# 绘制散点,设置坐标标签
ax.scatter(x, y, s=15, marker="x", color='red')
ax.set(ylabel='Y-var', xlabel='X-var')
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.set_xticks(np.arange(0, 1.1, 0.1))
ax.set_yticks(np.arange(0, 1.1, 0.1))

# 在散点旁标注年份
for i in range(len(x)):
    plt.annotate(df['year'].iloc[i], xy = (x[i], y[i]), 
                 xytext = (x[i]+0.015, y[i]-0.025))

# 分开绘制不同象限,并设色
x1 = np.array([0, 0.5, 0.5, 0])
y1 = np.array([0, 0, 0.5, 0.5])
y2 = np.array([0.5, 0.5, 0.8, 0.8])
y3 = np.array([0.8, 0.8, 1, 1])
x2 = np.array([0.5, 0.8, 0.8, 0.5])
x3 = np.array([0.8, 1, 1, 0.8])
ax.fill(x1, y1, color='#ffff33', alpha=0.3)
ax.fill(x1, y2, color='#3399ff', alpha=0.3)
ax.fill(x1, y3, color='#00cc66', alpha=0.3)
ax.fill(x2, y1, color='#ffad33', alpha=0.3)
ax.fill(x2, y2, color='#1a75ff', alpha=0.3)
ax.fill(x2, y3, color='#009933', alpha=0.3)
ax.fill(x3, y1, color='#cc6600', alpha=0.3)
ax.fill(x3, y2, color='#003d99', alpha=0.3)
ax.fill(x3, y3, color='#004d00', alpha=0.3)

# 绘制格网
ax.grid(c='black', ls='--')

将时间用渐变色表达,进行回归分析

地图学中有这样的知识,即视觉变量包括形状、尺寸、方向、颜色与网纹五大要素。其中,适用于绘制散点要素的变量常用的有形状(如三角形点与圆点)、尺寸(半径不同的点)与颜色(如聚类时的红色点与蓝色点)。就时间信息而言,一般不会使用形状或尺寸进行表达,因为这会给人偏离主题的视觉暗示,显得过于奇怪。相比之下,使用渐变色是个比较合理且合适的做法。

下面这两幅图是我自己使用 seaborn 绘制的带有回归线的散点图。在图一里,我既可以大致观察到上文提出的散点的移动路径,也可以关注到散点的分布情况;而引入带有置信区间的线性回归线,则能够帮助我更好地查看数据的变化趋势。图二则是分城市绘制了这样的趋势,在绘制这种图时需要特别注意,里面的两个变量里应该至少得有一个大致随年份增加而增加。例如,我的横坐标CNLI可以表征城市化水平,而这在绝大多数情况下都是不会逆转的,所以我才能取得这样的视觉效果。否则,虽然仍可以用颜色表征散点信息,但最好不要采用“回归分析”的分析方法!


image-20221101211557580
image-20221101212141979

绘制渐变色的散点是由sns.scatterplot实现的,而带置信区间的回归线则是由sns.scatterplot实现的。对于渐变色的配色可以自行查阅相关文档。上述绘图的核心代码如下:

# 绘制散点时,通过附带 hue 与 palette 字段以添加颜色
# 关闭自带的 legend,之后自己绘制图例
sns.scatterplot(x="CNLI", y="RSEI", data=df[df.CCode==310000], 
                hue='Year', palette="viridis_r", legend=False)

# 绘制回归线,默认95%的置信区间。
# 这个绘图函数没法设置散点颜色,因此设置散点大小为0,避免和之前的冲突。
sns.regplot(x="CNLI", y="RSEI", data=df[df.CCode==310000], 
            scatter_kws={"s":0})

绘制图例的方法在此不表,之后另起一文,结合“多子图共用一个配色方案”的内容单独说明。本文只是结合自己理解对散点图的使用做了一些细化的归纳补充,未来若有新的发现将会继续在此更新。

评论区
头像
    头像

    哈哈哈,写的太好了https://www.lawjida.com/

    头像

    《疯狂的契约》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/2570.html

    头像
    lcjnfjbnep
    2024年11月22日 02:38
    回复

    《霸道龙尊》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/18396.html

    头像
    kfyudwxgky
    2024年11月16日 20:57
    回复

    《霸道龙尊》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/18396.html

    头像
    gzjrrsdknt
    2024年10月06日 19:29
    回复

    不错不错,我喜欢看 www.jiwenlaw.com

    头像
    tlzmrnxewd
    2024年10月05日 19:51
    回复

    看的我热血沸腾啊www.jiwenlaw.com

    头像
    aipyhhsysl
    2024年10月04日 21:02
    回复

    看的我热血沸腾啊https://www.ea55.com/

    头像
    correyyttz
    2024年10月01日 20:37
    回复

    不错不错,我喜欢看 https://www.237fa.com/

    头像
    rzhiibazcc
    2024年09月23日 17:22
    回复

    叼茂SEO.bfbikes.com

    头像
    ivzuuvvuun
    2024年09月23日 16:37
    回复

    叼茂SEO.bfbikes.com

    头像
    haeiiludiq
    2024年09月22日 18:04
    回复

    博主真是太厉害了!!!

文章目录