首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Matplotlib数据关系型图表(1)

Matplotlib数据关系型图表(1)

作者头像
python数据可视化之路
发布于 2023-02-23 20:55:50
发布于 2023-02-23 20:55:50
1.9K0
举报

本篇文章主要介绍了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浓度。

代码如下:

代码语言:javascript
复制
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

代码如下:

代码语言:javascript
复制
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之间。

代码语言:javascript
复制
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)

绘制散点图和调用置信椭圆代码:

代码语言:javascript
复制
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()

完结

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档