python seaborn 散点图矩阵_Python绘图总结(seaborn库的使用)(下)

2023-10-29

上部分介绍了pie以及kdeplot、distplot、jointplot、pairplot的用法分别绘制出数据的饼图、核密度分布图、

柱状图、散点图、以及用jointplot绘制组合图。

下面开始总结(散点图(二维,三维),折线图,(并列,叠加)柱状图,三维曲面图,箱线图的画法):

(一)散点图:(relplot, scatterplot)

'''

seaborn.relplot(x=None, y=None, hue=None, size=None, style=None, data=None, row=None, col=None, col_wrap=None, row_order=None, col_order=None, palette=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, markers=None, dashes=None, style_order=None, legend='brief', kind='scatter', height=5, aspect=1, facet_kws=None, **kwargs)

'''

# -*- coding: utf-8 -*-

import seaborn as sns

import matplotlib.pyplot as plt

import pandas as pd

from scipy.stats import pearsonr,norm

data = pd.read_csv('anscombe.csv')

print(data.head())

sns.set_context('paper')

sns.set_style('ticks',{'font.sans-serif':['simhei','Arial']})

pal = sns.husl_palette(n_colors=4,l = .7)

sns.relplot(x = 'x', y = 'y', data = data, hue = 'dataset',style = 'dataset',sizes = (100,100),palette = pal)

plt.suptitle("不同组的x与y之间的关系")

plt.show()

996313-20200622155428636-331997265.png不同组相同style,都是圆形;

996313-20200622155554754-1280191593.png不同组不同style。

显然我们的目的不仅仅是观察散点分布,更重要的是为了寻求x与y之间以及不同组之间的关系。

我们对每一组的(x,y)连起来形成一个折线图,仅仅需要将kind = 'scatter'(默认)改为 kind = 'line';

可得图:

996313-20200622160642325-1665537525.png

可以看出第二组数据点形成的曲线近似于抛物线轨迹,第四组数据点都在直线上(垂直于x的直线,说明y与x无关,因为有一个点偏离较远所以导致折线图出现这种情况),而第一组和第三组,线性不是很明显,但是这两组y与x呈明显的正相关关系。

现在我们需要对这几组数据用回归拟合,找出每组内x与y之间的函数关系。

from scipy.stats importlinregress

data= pd.read_csv('anscombe.csv')

print(data.head())

sns.set_context('paper')

sns.set_style('ticks',{'font.sans-serif':['simhei','Arial']})

cls= ['I','II','III','IV']

markers= ['o','x','^','*']

c= ['r','b','g','y']

data= data[data['x']<18] #删除异常值,因为我们知道百分之95的数据的x都在(4,18)区间内,离群点对线性回归影响很大,特别是当数据量较小的时候

f= plt.figure(figsize=(8,6))for i in range(4):

dt= data[data['dataset']==cls[i]]

k,b,r,p,std= linregress(dt['x'],dt['y'])

flag= 1

ifnp.isnan(k):

k,b,r,p,std= linregress(dt['y'],dt['x'])

flag= 0plt.scatter(dt['x'],dt['y'],marker=markers[i],label =cls[i])ifflag:

plt.plot(dt['x'],k*dt['x']+b,color = c[i],label =cls[i])else:

plt.plot(k*dt['y']+b,dt['y'],color = c[i],label =cls[i])

flag= 1plt.legend(loc= 'upper left')

plt.suptitle('线性拟合各组数据')

plt.show()

996313-20200622175330520-1714856918.png

箱线图:

我们可以根据box图或者violin图来看每一组数据分布的区间,可以方便我们判断离群点:

data = pd.read_csv('anscombe.csv')

print(data.head())

sns.set_context('paper')

sns.set_style('ticks',{'font.sans-serif':['simhei','Arial']})

f= plt.figure(figsize=(8,6))

f.add_subplot(221)

sns.boxplot('dataset','x',data = data, palette = 'husl')

plt.xlabel('(a)')

f.add_subplot(222)

sns.boxplot('dataset','y',data = data, palette='husl')

plt.xlabel('(b)')

f.add_subplot(223)

sns.violinplot('dataset','x',data = data, palette = 'husl')

plt.xlabel('(c)')

f.add_subplot(224)

sns.violinplot('dataset','y',data = data, palette = 'husl')

plt.xlabel('(d)')

plt.tight_layout()

plt.show()

996313-20200622182334614-834093286.png

由图(c)可以看出第IV组的大部分的数据的x集中在8一点,而y分布与6周围,可以知道y和x的相关性很小,通过(a) (b)我们也可以看到离群点,

(a)至少有一个离群点,分布在x>18范围内,(b)至少有里两个离群点,分布在y>12范围内。

我们可以根据这个来删掉离群点,使得拟合结果更可信。

三维散点图:

先看三维曲线图:

importmatplotlib as mpl

from mpl_toolkits.mplot3dimportAxes3Dimportnumpy as npimportmatplotlib.pyplot as plt

mpl.rcParams['legend.fontsize'] = 10fig=plt.figure()

ax= fig.gca(projection='3d')

theta= np.linspace(-4 * np.pi, 4 * np.pi, 100) #变量theta,决定(x,y,z),所以形成的图形为三维空间中的一维曲线(z与theta是呈线性关系的,绘出100个点。

z= np.linspace(-2, 2, 100)

r= z ** 2 + 1x= r *np.sin(theta)

y= r *np.cos(theta)

ax.plot(x, y, z, label='curve',color = 'g')

ax.legend()

plt.show()

996313-20200622184317847-1744376165.png

再看三维散点图:

from mpl_toolkits.mplot3d importAxes3Dimportmatplotlib.pyplot as pltimportnumpy as np

from matplotlibimportcm

plt.rcParams['font.family'] = ['Arial Unicode MS'] # 用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] =False # 用来正常显示负号

sns.set_style('whitegrid', {'font.sans-serif': ['Arial Unicode MS', 'Arial']})

#用来解决中文方块化的问题

x= np.random.normal(0,2,size = (3,50))

y= np.random.normal(4,2,size = (3,50))

fig= plt.figure(figsize=(10,5))

ax1= fig.add_subplot(121, projection='3d')

ax1.scatter(x[0],x[1],x[2],color = 'r',marker = 'o',label = '红点')

ax1.scatter(y[0],y[1],y[2],color = 'b',marker = '^',label = '蓝点')

ax1.legend()

ax1.set_xlabel('X')

ax1.set_ylabel('Y')

ax1.set_zlabel('Z')

ax2= fig.add_subplot(122,projection='3d')

ax2.scatter(x[0],x[1],x[2],color = 'r',marker = 'o',label = '红点')

ax2.scatter(y[0],y[1],y[2],color = 'b',marker = '^',label = '蓝点')

x1= np.linspace(-5,5,100)

y1= np.linspace(-3,8,100)

x1,y1=np.meshgrid(x1,y1)

z1= 6*np.ones(shape = (100,100)) - x1 -y1

ax2.plot_surface(x1,y1,z1,cmap=cm.coolwarm,

rstride=1, # rstride(row)指定行的跨度

cstride=1, # 列跨度

linewidth= 0, #线宽最低

antialiased=True) #抗锯齿打开

ax2.legend()

ax2.set_xlabel('X')

ax2.set_ylabel('Y')

ax2.set_zlabel('Z')

plt.show()

996313-20200622210644297-1911478364.png

可以看出x + y + z = 6的平面刚好能够把红点和蓝点区分开。

因为红点呈中心为原点的正态分布,蓝点呈中心为(4,4,4)的正态分布,

x+y+z = 6刚好是过两个中心中点的垂直平面,可以将两个正态分布的散点区分开。

接下来我们要绘制x^2 - y^2 = z的图像 (马鞍面)

三维曲面图:

from mpl_toolkits.mplot3d importAxes3Dimportmatplotlib.pyplot as pltimportnumpy as np

from matplotlibimportcm

from matplotlib.tickerimportLinearLocator, FormatStrFormatter

plt.rcParams['font.family'] = ['Arial Unicode MS'] # 用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] =False # 用来正常显示负号

sns.set_style('whitegrid', {'font.sans-serif': ['Arial Unicode MS', 'Arial']})

#用来解决中文方块化的问题

x= np.linspace(-5,5,100)

y= np.linspace(-5,5,100)

x,y=np.meshgrid(x,y)

z= x**2-y**2f= plt.figure(figsize=(5,4))

ax= f.add_subplot(111,projection = '3d')

ax.plot_surface(x, y, z, cmap=plt.get_cmap('rainbow'), rstride = 4,cstride = 4,

linewidth=0, antialiased=False)

ax.set_zlim(-20, 20)

ax.zaxis.set_major_locator(LinearLocator(11)) #z方向上均匀分成11-1=10份,即找11个分点,

ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) #分节点的值保留两位小数

plt.show()

996313-20200622212839936-395730192.png

可以看出来当行跨度、列跨度为4的时候,划分曲线显得十分明显,使得整个曲面呈网格状。

另外我们能在plt.show()前面加上f.colorbar(surf, shrink=.5, aspect=5) #shrink越小,表示colorbar越小

便可以在右边绘制一个colorbar:

996313-20200622214011051-1444538412.png

我们从图中也可以看出相近的颜色的点高度都是相同的,我们能否直接绘制等高线呢?

当然可以!

from mpl_toolkits.mplot3d importaxes3dimportmatplotlib.pyplot as plt

from matplotlibimportcm

from matplotlib.tickerimportLinearLocator, FormatStrFormatter

plt.rcParams['font.family'] = ['Arial Unicode MS'] # 用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] =False # 用来正常显示负号

sns.set_style('whitegrid', {'font.sans-serif': ['Arial Unicode MS', 'Arial']})

#用来解决中文方块化的问题

x= np.linspace(-5,5,100)

y= np.linspace(-5,5,100)

x,y=np.meshgrid(x,y)

z= x**2-y**2f= plt.figure(figsize=(5,4))

ax= f.add_subplot(111,projection = '3d')

surf= ax.plot_surface(x, y, z, cmap=cm.coolwarm, rstride = 4,cstride = 4,

linewidth=0, antialiased=False)

cset= ax.contour(x, y, z, zdir = 'z',offset = 30, cmap=cm.coolwarm, antialiased=False)

ax.set_zlim(-20, 20)

ax.zaxis.set_major_locator(LinearLocator(11)) #z方向上均匀分成11-1=10份,即找11个分点,

ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) #分节点的值保留两位小数

ax.set_xlabel('X')

ax.set_ylabel('Y')

ax.set_zlabel('Z')

f.colorbar(surf, shrink=.5,aspect = 5)

plt.show()

996313-20200622215559030-1558805929.png

叠加柱状图(用处较大):

importnumpy as npimportmatplotlib.pyplot as plt

plt.rcParams['font.family'] = ['Arial Unicode MS'] # 用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] =False # 用来正常显示负号

sns.set_style('ticks', {'font.sans-serif': ['Arial Unicode MS', 'Arial']}) #用来解决中文方块化的问题

N= 13#含有13组数据 每一组又分为三类A B C,每一类的频数记录其中

A= (52, 49, 48, 47, 44, 43, 41, 41, 40, 38, 36, 31, 29)

B= (38, 40, 45, 42, 48, 51, 53, 54, 57, 59, 57, 64, 62)

d=[]for i in range(0, len(A)):

sum= A[i] +B[i]

d.append(sum)

C= (10, 11, 7, 11, 8, 6, 6, 5, 3, 3, 7, 5, 9)

ind=np.arange(N) #ind表示横轴坐标

width= 0.4 #条形宽度设为0.4p1= plt.bar(ind, A, width, color = '#636e72')

p2= plt.bar(ind, B, width, bottom=A, color = '#0984e3')

p3= plt.bar(ind, C, width, bottom=d, color = '#fdcb6e') #最上面一层应该是前面那个相加得到的d作为下限

plt.ylabel('频数')

plt.title('不同组别各类数目分布')

plt.xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7', 'G8', 'G9', 'G10', 'G11', 'G12', 'G13'))

plt.yticks(np.arange(0, 81, 20))

plt.legend((p1[0], p2[0], p3[0]), ('A', 'B', 'C'), loc = 'upper right', bbox_to_anchor = (1.13,1.02)) #用两个元组表示legend标签,p[0]表示该图所拥有的颜色

plt.show()

996313-20200622223238249-609951388.png

可以看出B类别在每个组都比较多,而A类别在每个组都比较少。

综上就是Python绘图主要用的一些函数及其实例,后面会更新一些有关机器学习算法的总结,大家一起学习,一起进步~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python seaborn 散点图矩阵_Python绘图总结(seaborn库的使用)(下) 的相关文章

  • lgvl菜单项优化

    项目场景 嵌入式CPU ASR3603S MCU 24MB ROM 16MB RAM 问题描述 功能菜单 设置菜单 菜单列表上下滑动有些慢 LVGL菜单滑动过程中卡顿感 原因分析 代码执行耗时 图片加载耗时 缓冲区太小多次刷新耗时 解决方案
  • 关于微信小程序获取头像和昵称

    不知道为什么微信一直对开发者获取 微信头像 微信昵称 一直抱以限制态度 关于接口调用方法 也是一直在修改 open type getUserInfo 在2021年4月13日停用 wx getUserInfo 在2021年4月28日停用 wx
  • 矢量网络分析仪(矢网)组成和原理简介

    一 概述 矢量网络分析仪是一种常见的射频测量仪器 主要用来测量高频器件 电路及系统的性能参数 如线性参数 非线性参数 变频参数等 1 1 分类 矢量网络分析仪一般以频率来划分 截止频率越高 价格也越贵 根据测试端口的数量可分为 双端口 3
  • oracle重新编译package,这个package为什么编译不了?该怎么解决

    SQL codecreate or replace package pack sunyard test is type refcur is ref cursor 函数名称 func sunyard test 作者 sunyard zheng
  • 阶段性学习总结

    前 言 从开学到现在 时间已过去两个月之久 这段时间 一直断断续续做js学习研究 有时候浪费了不少时间 还疑惑不断 下面就这段时间学习状况 以及相关的生活习惯做关联总结 javascripty以下简称 javascript 总体 在总结之前
  • 后台登陆万能密码总结

    1 Asp Aspx万能密码 or or or 1 1 or 1 1 or a a or a a or a a or a a or 1 1 a or 1 1 or a a or 1 or 1 1 1 1 or 1 1 or 1 1 OR 1
  • MPI并行编程——多进程程序设计

    MPI Massage Passing Interface 它不是一种语言 而是一种库描述 是消息传递函数库的标准规范 MPI标准定义了一组具有可移植性的编程接口 在Fortran和C C 中可以直接对相应的函数进行调用 MPI有很多种实现
  • 基于python的在线考试系统的设计与实现

    源码获取 点击下载 基于python的在线考试系统的设计与实现 本系统实现了在线考试网的主要功能 以无纸化的管理不但可以提高工作效率 减少监考人员数量 增强公平性等 而且可以实现学校或企业的低成本投入 高效率办公的宗旨 在线考试网 它包括有
  • Windows日志浅析

    从这篇文章开始本人开始结合Windows产品日志分析大神 RANDY FRANKLINSMITH 的电子书 以及自己的实验对Windows操作系统的日志开始分析 也是对自己的一种激励 至少希望自己能坚持下去这个分析 并且希望自己可以通过这个
  • 网易月薪25K的Linux运维面试真题曝光,值得一试!

    首先我们来看下网易Linux运维工程师招聘岗位要求 岗位定义 高级系统工程师 应用运维 岗位薪资 15K 25K 职位描述 1 负责公司运维体系的建设 组织在线移动APP和业务系统以及自建私有云的监控 维护 推进自动化运维 2 建立和完善公
  • Flink CDC 详解

    目录 一 CDC 简介 二 Flink CDC 案例实操 三 Flink CDC 2 0 四 核心原理分析 一 CDC 简介 什么是 CDC CDC 是 Change Data Capture 变更数据获取 的简称 核心思想是 监测并捕获数
  • 埋点是什么?有什么作用?前端如何埋点?

    一 什么是埋点 埋点 tracking 是指在应用程序中插入代码或工具来记录某些事件的行为和属性 例如用户在应用中的点击 浏览 购买 注册等操作行为 这些数据可以被用来分析用户行为 优化产品功能 改进用户体验等 通过埋点 开发人员可以采集用
  • SQL类型操作集合

    字符串使用汇总 将字符串中从某个字符开始截取一段字符 然后将另外一个字符串插入此处 select stuff hello world 4 4 返回值hel orld 返回从指定位置开始指定长度的字符串 select substring He
  • IP协议详解之IPv6头部结构简介

    IPv6协议是网络层技术发展的必然趋势 因为它不仅解决了IPv4地址不够用的情况 还做了很大的改进 比如 增加了多播和流的功能 为网络上多媒体内容的质量提供精细的控制 引入自动配置功能 使得局域网管理更加方便 增加了专门的网络安全功能 IP
  • 计算机网络----数据封装过程,TCP/IP 模型与OSI模型的比较,IP包头格式

    数据封装过程 应用层 上层数据 传输层 数据段segement TCP头部 上层数据 网络层 数据包package IP头部 TCP头部 上层数据 数据链路层 数据帧frame MAC头部 IP头部 TCP头部 上层数据 物理层 比特流bi
  • Python 21.opencv 霍夫直线变换

    import cv2 import numpy as np img cv2 imread lane jpg img cv2 imread pic2 PNG gray cv2 cvtColor img cv2 COLOR BGR2GRAY e
  • 一位博士的返乡笔记,深刻入骨!

    王磊光 正和岛 2023 01 24 17 15 发表于甘肃 这是一位博士 春节回家的观察和总结 从乡村到城市 是一个长久被书写的主题 其中的个人体验 其实就是城镇化历史的一部分 本文发表于2015年春节 当时人民网也转发了此文 距今已8年

随机推荐

  • LeetCode-1305. All Elements in Two Binary Search Trees

    Given two binary search trees root1 and root2 Return a list containing all the integers from both trees sorted in ascend
  • PyTorch no longer supports this GPU because it is too old.

    今天在linux系统 gtx 960显卡 cuda 9 1版本上用pytorch操作显卡 报出了如下warning PyTorch no longer supports this GPU because it is too old 且程序出
  • 【转】Qt多线程操作界面---在QThread更新QProgressBar

    include
  • 多目标粒子群算法论文【matlab代码】

    一 算法思路 多目标优化问题存在于生活当中的方方面面 在机器学习中的数据预处理特征选择阶段 所选取的特征子集大小与降低其分类错误率就是两个冲突的目标 要在尽量选取较少特征子集的同时降低分类的错误率 许多学者尝试利用基于变异 拥挤和支配策略的
  • 观察者模式与发布-订阅模式

    相关设计模式 设计模式 design pattern 是针对软件设计中普遍存在的各种问题所提出的解决方案 观察者模式 发布 订阅模式 观察者模式 观察者模式 Observer pattern 指的是在对象间定义一个一对多 被观察者与多个观察
  • Linux RS232/485/GPS 驱动实验

    一 Linux 下 UART 驱动框架 本实验驱动厂商已写好 只需看原理图改设备树就行 1 uart driver 注册与注销 uart driver 结构体表示 UART 驱动 uart driver 定义在 include linux
  • QT学习笔记(一)之本地播放器

    先从百度百科上摘取一段QT定义 Qt是 一个1991年由奇趣科技开发的跨平台 C 图形用户界面 应用程序开发框架 它既可以开发 GUI 程序 也可用于开发非GUI程序 比如控制台工具和服务器 Qt是面向对象的框架 使用特殊的代码生成扩展 称
  • unity基础开发----在Unity3D里面实现自动开门和关门

    当角色或者摄像机靠近门的时候 门自动打开 离开门自动关上 步骤一 制作铰链和门 首先在你的场景中建立一个立方体 然后缩小放到门的左面 命名为 Door Hinge 再建立一个立方体 命名为 Door 现在 在你的 Hierarchy 中就能
  • TVP走进泸州老窖:数字化时代下,共话加速转型之道

    引言 数字化技术的发展 为传统行业转型提供了重要契机 与早先的基础数字化不同 随着数字化转型在各行业逐渐迈入深水区 如何将数字技术与应用有机融入传统行业 推动企业实现高质量发展 实现数字技术与企业体系的深度融合 已成为各行业转型的关键所在
  • abp流程引擎

    参考大神的博客 https www cnblogs com spritekuang asp net core Identity Server权限替代方案 https www keycloak org documentation
  • UDP 协议头部格式

    以下定义是在kernel4 14中 1 结构 struct udphdr be16 source be16 dest be16 len sum16 check 2 含义 source 16位源端口 这个字段占据 UDP 报文头的前 16 位
  • mysql卸载后重装失败_mysql卸载后重装,php无法调用。

    2011 11 26 回答 最近mysql要卸载后重装 但是到最后一步后启动服务一直不行 总的来说 卸载重装出现问题有3个原因 1 services msc 里已经有同名的服务 2 mysql 的my ini 配置与安装时的设置有出入 多次
  • Linux Shell拾遗1

    1 echo添加 e使用转义 env命令查看环境变量 2 变量赋值不要加空格 加 打印变量内容 export声明全局环境变量 export PATH PATH xxx yyy新增环境变量 众所周知的环境变量HOME PWD USER UID
  • 小程序新建页面的时候报错了,该怎么解决?

    报错内容如下 app json json 文件错误 app json app json Expecting EOF got STRING 2 pages 3 pages index index gt 4 pages logs logs 5
  • Zero-shot Learning / One-shot Learning

    Introduction 在 迁移学习 中 由于传统深度学习的 学习能力弱 往往需要 海量数据 和 反复训练 才能修得 泛化神功 为了 多快好省 地通往炼丹之路 炼丹师们开始研究 Zero shot Learning One shot Le
  • altium designer 中走线宽度设置的方法

    1 设计 gt 类 gt Net Class gt 鼠标右键添加类 gt 把比如电源和地线归为一类 命名为GND VCC 2 设计 gt 规则 gt Routing gt Width gt 选中网络类 gt 选择GND VCC 然后选择好要
  • $.post 提交长度过大问题

    Json 参数长度过大 无法反序列化为Json
  • NCBI Genbank核苷酸序列数据库检索基因序列解读

    核酸数据库 Genbank数据库 Nucleotide数据库 一 基因序列注释内容解析 以dut基因编码的大肠杆菌酶dutpase为例 在Nucleotide数据库search X01714或者dutpase 检索链接https www n
  • vue2自定义loading组件

    概要 通常情况下 我们在使用element ui时会使用到loading组件 一般用于对表格请求响应时间过长的时候使用loading 然而依然有一些其他情况需要用的loading 这个时候 v loading指令在其他组件上不生效了 所以官
  • python seaborn 散点图矩阵_Python绘图总结(seaborn库的使用)(下)

    上部分介绍了pie以及kdeplot distplot jointplot pairplot的用法分别绘制出数据的饼图 核密度分布图 柱状图 散点图 以及用jointplot绘制组合图 下面开始总结 散点图 二维 三维 折线图 并列 叠加