
本篇文章主要介绍了matplotlib的数据关系型图表的分类、对每个类别做了简介,并初步对数值关系型常见图表的实现方式做了探讨。
数据关系图的分类和简介
数据关系型图表分为:数值关系型、层次关系型和网络关系型三种类型。
数值关系图:主要展示两个或多个变量之间的关系,最常见的包括散点图、气泡图、曲面图、矩阵散点图等。当变量为1-3个时,可以使用散点图、气泡图或曲面图等。当变量超过3维,可以考虑高维数据可视化方法,例如平行坐标系、矩阵散点图、星形图等。
层次关系图:主要表示数据个体之间的层次关系,主要包括包含和从属两类,比如公司不同部门的组织结构,不同洲国家包含关系等,包括链接图、树形图、冰柱图、旭日图、矩阵树状图等等。
网络关系图:主要是指那些不具备层次结构的关系数据的可视化。与层次关系数据不同,网络数据不具备从上到下或从下到上的层次结构,表达的关系更加自由和复杂,可视化方法如:桑基图、和弦图、节点链接图、弧长链接图、蜂箱图等。
一、数值关系型图表
1、散点图
散点图是比较常见的图表类型之一,通常用于显示和比较数值。散点图可以提供三类关键信息:1)变量之间是否具有关联趋势;2)如果存在关联趋势,是线性还是非线性;3)观察是否存在离群值,从而分析这些离群值对建模分析的影响。
语法:
plt.scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,vmin=None, vmax=None,alpha=None,**kwargs)
x,y:数据的位置。
s:数据点的大小,可以传入一个整数,表示为所有点设置一样的大小;也可以传入形状为(n, 1)的数组,为每一个点指定大小。(可选参数)
c:数据点颜色,可以是颜色简写、十六进制等。也可以传入形状为(n, 1)的数组,为每个点指定颜色。(可选参数)
marker:数据标记点样式。(可选参数)
marker | 描述 |
|---|---|
'.' | 点 |
',' | 像素 |
'o' | 圆圈 |
'v' | 下三角 |
'^' | 上三角 |
'>' | 右三角 |
'8' | 8角形 |
's' | 正方形 |
'*' | 星型 |
'x' | x号 |
'D' | 钻石 |
'd' | 菱形 |
... | ... |
cmap:色条。当且仅当c为浮点数数组才可使用。(可选参数)
norm:如果c为浮点数数组,norm将调整c的范围至0-1用于在cmap中映射。(可选参数)
vmin,vmax:亮度设置,如果norm设置了,此参数无效。(可选参数)
alpha:透明度。
**kwargs:其他设置,用的不是很多,具体可以参考官方文档。(可选参数)
1.1 带有颜色映射的散点图
示例1:现在有一个文件,记录了2015年全国所有站点的PM2.5值,要求将1001A站点的全年PM2.5值用散点图表示,横坐标为时间,纵坐标为PM2.5浓度。

代码如下:
import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd
import numpy as np
file = r"D:\公众号\Pandas基本操作\2015站点匹配.csv"
df = pd.read_csv(file)
sel_df = df[(df['site'] == '1001A')] #筛选1001A的站点行
pm25 = sel_df['pm2_5'].values.reshape(-1, 1) #获取pm2.5值,并转为数组
time = (sel_df['time'] - 2015000).values.reshape(-1, 1) #获取时间序列,并转为数组
fig = plt.figure(figsize = (8, 8))
#默认样式绘图
ax1 = fig.add_subplot(221)
ax1.scatter(time, pm25)
#为每个点设置颜色,即将每个点的pm25值数组作为颜色传入
ax2 = fig.add_subplot(222)
cf = ax2.scatter(time, pm25, c = pm25)
cbar = fig.colorbar(cf, ax = ax2) #因为每个点都有颜色,该语句是形成色条,这个语法以后会讲,不用管
#为每个点设置颜色,并指定色条 为'jet'样式,其余色条参照以前写的文章
ax3 = fig.add_subplot(223)
cf = ax3.scatter(time, pm25, c = pm25, cmap = 'jet')
#extend参数设置色条两端是否凸起
cbar = fig.colorbar(cf, ax = ax3, extend = 'both')
#为每个点设置大小,小于120为15,大于120为40
ax4 = fig.add_subplot(224)
size = []
#为每个点设置大小
for value in pm25:
son_size = 40 if value[0] > 120 else 15
size.append(son_size)
cf = ax4.scatter(time, pm25, s = size, c = pm25, cmap = 'jet')
cbar = fig.colorbar(cf, ax = ax4, extend = 'both')
plt.show()
1.2 带有回归线的散点图
示例2:在上述基础上,在散点图中增加回归线。
注:线性回归需要下载sklearn库。
若pip下载过慢,可以加入一个镜像,如下命令所示,使用清华镜像下载:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sklearn
代码如下:
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import linear_model
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
font1 = {'family': 'simsun', 'size': 14} #设置字体样式
fig = plt.figure(figsize = (8, 4))
df = pd.read_csv(file)
sel_df = df[(df['site'] == '1001A')]
pm25 = sel_df['pm2_5'].values.reshape(-1, 1) #pm2.5值
time = (sel_df['time'] - 2015000).values.reshape(-1, 1) #时间序列
ax1 = fig.add_subplot(121)
model=linear_model.LinearRegression()
model.fit(time, pm25) #线性回归拟合
pm25_pred = model.predict(time)
ax1.scatter(time, pm25, s = 10, c = 'k')
ax1.plot(time, pm25_pred, c = 'r', linewidth = 2) #绘制回归线,颜色为红色,线宽为2
ax1.set_title('线性回归', font1) #采用1样式设置标题
ax2 = fig.add_subplot(122)
#sklearn进行非线性拟合,需要进行特征构造,degree为次数,二次多项式则为2,否则为3
poly_reg = PolynomialFeatures(degree = 2)
x_poly = poly_reg.fit_transform(time) #特征构造
linear_reg = LinearRegression()
linear_reg.fit(x_poly, pm25) #特征与pm25拟合
pm25_pred = linear_reg.predict(poly_reg.fit_transform(time))
ax2.scatter(time, pm25, s = 10, c = 'k')
ax2.plot(time, pm25_pred, c = 'r', linewidth = 2)
ax2.set_title('二次回归', font1)
plt.show()
1.3 带置信椭圆的散点图
示例:现有一组数据,记录了2020年pm2.5的真实值和使用模型预测的pm2.5预测值,现将前1000条的真实值和预测值用散点图表示,并用置信椭圆在图上标出。

思路:1、构造一个置信椭圆的绘制方法
2、绘制散点图
3、调用置信椭圆方法在图上标出
注:置信椭圆方法参考matplotlib官方文档,本文仅作示例,感兴趣可以参考如下网址:
https://matplotlib.org/stable/gallery/statistics/confidence_ellipse.html#sphx-glr-gallery-statistics-confidence-ellipse-py
置信椭圆构造方法,可以直接复制。
注:置信椭圆默认为3sigma区间,自定义设置时,取值应在1-3之间。
def confidence_ellipse(x, y, ax, n_std=3.0, facecolor='none', **kwargs):
cov = np.cov(x, y)
pearson = cov[0, 1]/np.sqrt(cov[0, 0] * cov[1, 1])
ell_radius_x = np.sqrt(1 + pearson)
ell_radius_y = np.sqrt(1 - pearson)
ellipse = Ellipse((0, 0), width=ell_radius_x * 2, height=ell_radius_y * 2,
facecolor=facecolor, **kwargs)
scale_x = np.sqrt(cov[0, 0]) * n_std
mean_x = np.mean(x)
scale_y = np.sqrt(cov[1, 1]) * n_std
mean_y = np.mean(y)
transf = transforms.Affine2D().rotate_deg(45)\
.scale(scale_x, scale_y).translate(mean_x, mean_y)
ellipse.set_transform(transf + ax.transData)
return ax.add_patch(ellipse)绘制散点图和调用置信椭圆代码:
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
import matplotlib.transforms as transforms
import pandas as pd
file1 = r"D:\公众号\Pandas基本操作\2020预测.csv"
info = pd.read_csv(file1)
x = info['pm2_5'][:1000] #选择前1000真实值数据
y = info['pred_pm2_5'][:1000] #选择前1000预测值数据
ax1 = fig.add_subplot(121)
ax1.scatter(x, y, s=2, c = 'k', alpha = .7)
#调用置信椭圆,绘制1sigma和2sigma区域,设置边缘颜色为红色和蓝色,线条为实线(默认)和虚线
confidence_ellipse(x, y, ax1, n_std=1, label=r'$1\sigma$', edgecolor='r',)
confidence_ellipse(x, y, ax1, n_std=2, label=r'$2\sigma$', edgecolor='b', linestyle='--',)
ax1.axhline(y = 0.0, c = 'gray', ls = '-', lw = 1)
ax1.axvline(x = 0.0, c = 'gray', ls = '-', lw = 1)
ax1.set_title('Different standard deviations')
ax1.legend()
ax2 = fig.add_subplot(122)
ax2.scatter(x, y, s=2, c = 'k', alpha = .7)
#在上一个基础上对置信椭圆设置表面颜色
confidence_ellipse(x, y, ax2, n_std=1, label=r'$1\sigma$', edgecolor='k', facecolor = 'r', alpha = .7)
confidence_ellipse(x, y, aax2, n_std=2, label=r'$2\sigma$', edgecolor='k', linestyle='--', facecolor = 'pink', alpha = .7)
ax2.axhline(y = 0.0, c = 'gray', ls = '-', lw = 1)
ax2.axvline(x = 0.0, c = 'gray', ls = '-', lw = 1)
ax2.legend()
plt.show()
完结