Python散点图矩阵示例--以空气质量数据为例
散点图矩阵近来在数据分析和可视化中得到了很好的应用。它同时包含了直方图和散点图,位于对角线位置的直方图表示每一个变量的分布,对角线上下的散点图展示了变量两两之间的关系。在R、python和MATLAB中都提供了相应的包或函数进行散点图矩阵的绘制。
本文以之前爬取的空气质量数据为例,使用python绘制散点图矩阵,分析空气质量数据指标间的关系。
用法:
df = read_data("data/AIR_beijing.csv") # 读取数据
tmp_ = df[['AQI', 'PM25', 'PM10', 'SO2', "Month"]] # 提取数据
sns.pairplot(tmp_)
就是这么简单的一句代码,就能展示变量两两之间的关系,对角线上是每个变量的直方图,可以看出每个变量值的分布;非对角线是两个变量的散点图,可以比较方便的看出AQI和PM2.5有很强的相关性。
使用hue参数分类显示,使用不同颜色描述不同的类别。
用法:
sns.pairplot(tmp, hue = "Month", diag_kind = "hist")
当想通过不同颜色来表示不同类别时,只需要将参数hue设置成分类的字段,就可以很方便用不同颜色来显示。例如此处使用月份来分类。
使用核密度估计(Kernel Density Estimation, KDE)。
用法:
tmp_ = tmp[(tmp["Month"] == 6) | (tmp["Month"] == 12)]
sns.pairplot(tmp_, hue = "Month", diag_kind = "kde")
当想通过核密度曲线来替换直方图,可以直接将参数diag_kind设置为"kde"。此处,通过6月份和12月份两个月份来对比,可见6月AQI值更集中(核密度曲线窄,左上角),12月份出现了空气质量较差的极端值。
高级方法,使用自定义grid,并指定绘制方法。
用法:
grid = sns.PairGrid(data = tmp_, vars = ['AQI', 'PM25', 'PM10'], height = 2)
grid = grid.map_upper(plt.scatter, color = 'r') # 矩阵右上角
grid = grid.map_diag(plt.hist, bins = 20, color = 'b', edgecolor = 'k') # 对角线
grid = grid.map_lower(sns.kdeplot, cmap = "Greens") # 矩阵左下角
当想让矩阵不同的块分别画不同类型的图,就可以使用PairGrid来自定义。此处矩阵右上角采用散点图,对角线采用直方图,左下角采用的核密度估计。
显示变量之间的相关系数以及一些描述信息。
用法:
grid = sns.PairGrid(data = tmp_, vars = ['AQI', 'PM25', 'PM10'], height = 2)
grid = grid.map_upper(plt.scatter, color = 'r')
grid = grid.map_upper(cal_corr, color = 'r') # 相关系数
grid = grid.map_diag(show_summary) # 详细信息
grid = grid.map_lower(sns.kdeplot, cmap = "Greens")
同时,在右上角画出散点图后,如果想看看两个变量之间的相关关系,便可以自定义cal_corr函数,并通过map_upper函数进行调用。从这里我们可以看出AQI和PM2.5的相关系数最高,达到了0.88;如果需要将某个变量的均值、标准差以及分位数进行显示,就可以自定义show_summary函数进行绘制。
代码
# 部分代码
# 计算相关系数
grid = sns.PairGrid(data = tmp_, vars = ['AQI', 'PM25', 'PM10'], height = 2)
grid = grid.map_upper(plt.scatter, color = 'r')
grid = grid.map_upper(cal_corr, color = 'r')
# grid = grid.map_diag(plt.hist, bins = 20, color = 'b', edgecolor = 'k')
grid = grid.map_diag(show_summary)
grid = grid.map_lower(sns.kdeplot, cmap = "Greens")
plt.suptitle("Pair Plot of Air Quantity")
数据分享---GIMMS NDVI 3gv1(1982-2015)