当前位置: 首页 > news >正文

MATLAB | 如何解决实验数据散点图重叠问题(overlap)

本期部分实验效果:

这期讲一下如果数据重合严重该咋办(overlap),事先说明,本文中的绘图均使用一个几行的简单小代码进行了修饰:

function defualtAxes
ax=gca;hold on;box on
ax.XGrid='on';
ax.YGrid='on';
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.LineWidth=.8;
ax.GridLineStyle='-.';
ax.FontName='Cambria';
ax.FontSize=12;
end

0 数据说明及基础绘图

假设我们随机构建两列数据:

% 随便生成散点
PntSet1=mvnrnd([2 3],[1 0;0 2],800);
PntSet2=mvnrnd([6 7],[1 0;0 2],800);
PntSet3=mvnrnd([8 9],[1 0;0 1],800);
PntSet=[PntSet1;PntSet2;PntSet3];
X=PntSet(:,1);
Y=PntSet(:,2);

scatter函数绘图效果:

% 使用scatter绘图
scatter(X,Y,'filled','CData',[36,59,66]./255);% 简单修饰,可省略
defualtAxes()

可以看到数据重叠严重,根本看不出哪里最密集,以下讲几个简单的解决数据重叠的方法。


1 设置透明度

这个就很简单,设置MarkerFaceAlpha即可:

% 使用scatter绘图
scatter(X,Y,'filled','CData',[36,59,66]./255,'MarkerFaceAlpha',.5);% 简单修饰,可省略
defualtAxes()


2 根据密度设置CData

分割网格计算核密度,可以自行调整网格划分格子数,然后通过插值计算每个点所处位置核密度并将其映射为颜色:

% 横竖分割一百格计算核密度
n=100;
XList=linspace(min(X),max(X),n);
YList=linspace(min(Y),max(Y),n);
[XMesh,YMesh]=meshgrid(XList,YList);
F=ksdensity([X,Y],[XMesh(:),YMesh(:)]);
ZMesh=reshape(F,size(XMesh));
H=interp2(XMesh,YMesh,ZMesh,X,Y);% 使用scatter绘图
scatter(X,Y,'filled','CData',H);% 简单修饰,可省略
defualtAxes()

当然可以通过colormap设置其他配色:

colormap(summer)

自己随便弄个配色:

CM=[0.2700         0    0.33000.2700    0.2300    0.51000.1900    0.4100    0.56000.1200    0.5600    0.55000.2100    0.7200    0.47000.5600    0.8400    0.27000.9900    0.9100    0.1300];
colormap(CM)

颜色有点不连续了,插一下值:

CM=[0.2700         0    0.33000.2700    0.2300    0.51000.1900    0.4100    0.56000.1200    0.5600    0.55000.2100    0.7200    0.47000.5600    0.8400    0.27000.9900    0.9100    0.1300];
CMX=linspace(0,1,size(CM,1));
CMXX=linspace(0,1,256)';
CM=[interp1(CMX,CM(:,1),CMXX,'pchip'),...interp1(CMX,CM(:,2),CMXX,'pchip'),...interp1(CMX,CM(:,3),CMXX,'pchip')];
colormap(CM)


3 等高线

还是上面的核密度计算方法,然后直接画为等高线:

% 横竖分割一百格计算核密度
n=100;
XList=linspace(min(X),max(X),n);
YList=linspace(min(Y),max(Y),n);
[XMesh,YMesh]=meshgrid(XList,YList);
F=ksdensity([X,Y],[XMesh(:),YMesh(:)]);
ZMesh=reshape(F,size(XMesh));
H=interp2(XMesh,YMesh,ZMesh,X,Y);% 绘制等高线图及散点图
hold on
scatter(X,Y,1,'filled','CData',[36,59,66]./255);
contour(XMesh,YMesh,ZMesh,20,'LineWidth',.8)% 简单修饰,可省略
defualtAxes()


4 等高线填充

还是和上面几乎一样:

% 横竖分割一百格计算核密度
n=100;
XList=linspace(min(X),max(X),n);
YList=linspace(min(Y),max(Y),n);
[XMesh,YMesh]=meshgrid(XList,YList);
F=ksdensity([X,Y],[XMesh(:),YMesh(:)]);
ZMesh=reshape(F,size(XMesh));
H=interp2(XMesh,YMesh,ZMesh,X,Y);% 绘制等高线填充图
hold on
contourf(XMesh,YMesh,ZMesh,15,'EdgeColor','none')

我们设置小于一定值就不画了,这里设置为1e-3可自行调整:

% 横竖分割一百格计算核密度
n=100;
XList=linspace(min(X),max(X),n);
YList=linspace(min(Y),max(Y),n);
[XMesh,YMesh]=meshgrid(XList,YList);
F=ksdensity([X,Y],[XMesh(:),YMesh(:)]);
ZMesh=reshape(F,size(XMesh));
H=interp2(XMesh,YMesh,ZMesh,X,Y);% 绘制等高线填充图
hold on
levels=linspace(1e-3,max(max(H)),15);
contourf(XMesh,YMesh,ZMesh,levels,'EdgeColor','none')

依旧改一下配色:

colormap(turbo)

也可以用自己配色,怕乱直接把这部分完整代码放在一起:

% 横竖分割一百格计算核密度
n=100;
XList=linspace(min(X),max(X),n);
YList=linspace(min(Y),max(Y),n);
[XMesh,YMesh]=meshgrid(XList,YList);
F=ksdensity([X,Y],[XMesh(:),YMesh(:)]);
ZMesh=reshape(F,size(XMesh));
H=interp2(XMesh,YMesh,ZMesh,X,Y);% 绘制等高线填充图
hold on
levels=linspace(1e-3,max(max(H)),15);
contourf(XMesh,YMesh,ZMesh,levels,'EdgeColor','none')
scatter(X,Y,1,'filled','CData',[36,59,66]./255);% 设置colomap
% colormap(turbo)
CM=[0.2700         0    0.33000.2700    0.2300    0.51000.1900    0.4100    0.56000.1200    0.5600    0.55000.2100    0.7200    0.47000.5600    0.8400    0.27000.9900    0.9100    0.1300];
CMX=linspace(0,1,size(CM,1));
CMXX=linspace(0,1,256)';
CM=[interp1(CMX,CM(:,1),CMXX,'pchip'),...interp1(CMX,CM(:,2),CMXX,'pchip'),...interp1(CMX,CM(:,3),CMXX,'pchip')];
colormap(CM)% 简单修饰,可省略 
defualtAxes()


5 rug图

就是边缘加一些竖线状散点,就有点像地毯的边缘:

% 使用scatter绘图
hold on
scatter(X,Y,10,'filled','CData',[36,59,66]./255);% 绘制边际线条状散点(rug图)
ax=gca;
XLim=ax.XLim;YLim=ax.YLim;
X=X(:)';Y=Y(:)';
LXX=[X;X;X.*nan];
LXY=[Y.*0+YLim(1);Y.*0+YLim(1)+(diff(YLim))/20;Y.*nan];
plot(LXX(:),LXY(:),'Color',[[36,59,66]./255,.3]);LYY=[Y;Y;Y.*nan];
LYX=[X.*0+XLim(1);X.*0+XLim(1)+(diff(XLim))/20;X.*nan];
plot(LYX(:),LYY(:),'Color',[[36,59,66]./255,.3]);% 简单修饰,可省略
defualtAxes()


6 分bin图

这里横竖都分为30块:

% 分X,Y30块的分bin图
binscatter(X,Y,[30 30])
colorbar% 简单修饰,可省略
defualtAxes()


7 柱状图

在分bin图格子里画一些柱状图:

% 绘制散点图及柱状图
hold on
bcHdl=binscatter(X,Y,[20,20],'Visible','off');
scatter(X,Y,1,'filled','CData',[36,59,66]./255);
XMean=(bcHdl.XBinEdges(1:end-1)+bcHdl.XBinEdges(2:end))./2;
YMean=(bcHdl.YBinEdges(1:end-1)+bcHdl.YBinEdges(2:end))./2;
XSep=diff(bcHdl.XBinEdges(1:2));
YSep=diff(bcHdl.YBinEdges(1:2));
for i=1:size(bcHdl.Values,1)for j=1:size(bcHdl.Values,2)fill([-1,-1,1,1].*XSep./3+XMean(i),...[1,0,0,1].*YSep.*bcHdl.Values(i,j)./max(max(bcHdl.Values)).*.95+YMean(j),...[36,59,66]./255,'FaceAlpha',.9,'EdgeColor','none')end
end% 简单修饰,可省略
defualtAxes()


8 surf曲面

类似分bin图,不过这里不是数量统计,而是核密度:

% 横竖分割计算核密度
n=30;
XList=linspace(min(X),max(X),n);
YList=linspace(min(Y),max(Y),n);
[XMesh,YMesh]=meshgrid(XList,YList);
F=ksdensity([X,Y],[XMesh(:),YMesh(:)]);
ZMesh=reshape(F,size(XMesh));
H=interp2(XMesh,YMesh,ZMesh,X,Y);% 绘制surf曲面
hold on
ZMesh(ZMesh<1e-3)=nan;
surf(XMesh,YMesh,ZMesh,'EdgeColor','none');% 加一行[1,1,1]把小数值设置为白色
colormap(parula)% 简单修饰,可省略
defualtAxes()


9 气泡图

还是类似的,不过换成了bubble气泡图:

% 横竖分割计算核密度
n=30;
XList=linspace(min(X),max(X),n);
YList=linspace(min(Y),max(Y),n);
[XMesh,YMesh]=meshgrid(XList,YList);
F=ksdensity([X,Y],[XMesh(:),YMesh(:)]);
ZMesh=reshape(F,size(XMesh));
H=interp2(XMesh,YMesh,ZMesh,X,Y);% 绘制气泡图
ZMesh(ZMesh<1e-3)=nan;
bubblechart(XMesh(:),YMesh(:),ZMesh(:),ZMesh(:),'MarkerEdgeColor','none')
bubblesize([1,12])% 简单修饰,可省略
defualtAxes()


10 花里胡哨没用的三角剖分

% 横竖分割一百格计算核密度
n=100;
XList=linspace(min(X),max(X),n);
YList=linspace(min(Y),max(Y),n);
[XMesh,YMesh]=meshgrid(XList,YList);
F=ksdensity([X,Y],[XMesh(:),YMesh(:)]);
ZMesh=reshape(F,size(XMesh));
H=interp2(XMesh,YMesh,ZMesh,X,Y);% 没啥用的三角化插值绘图
hold on
DT=delaunay(X,Y);
Z=(H(DT(:,1),:)+H(DT(:,2),:)+H(DT(:,3),:))./3;
trisurf(DT,X,Y,X.*0,'CData',Z,'EdgeColor','none')% 简单修饰,可省略
defualtAxes()

相关文章:

MATLAB | 如何解决实验数据散点图重叠问题(overlap)

本期部分实验效果&#xff1a; 这期讲一下如果数据重合严重该咋办(overlap)&#xff0c;事先说明&#xff0c;本文中的绘图均使用一个几行的简单小代码进行了修饰&#xff1a; function defualtAxes axgca;hold on;box on ax.XGridon; ax.YGridon; ax.XMinorTickon; ax.YMinor…...

Kubernetes 一键部署利器:kubeadm

文章目录集群部署痛点kubeadm 的工作原理kubeadm init 的工作流程kubeadm join 的工作流程kubeadm 的部署配置参数集群部署痛点 Kubernetes 的部署一直以来都是挡在初学者前面的一只“拦路虎”。尤其是在 Kubernetes 项目发布初期&#xff0c;它的部署完全要依靠一堆由社区维护…...

[jS 事件循环理解] 主线程 宏任务 微任务 - 执行顺序优先级理解

最近看了一个帖子 事件循环机制-宏任务-微任务 把js单线程中 , 主线程 | 宏任务 | 微任务 的调用顺序讲解的很直白精巧 , 记录一下以供查阅 1.主线程, 可以理解为从上到下顺序执行的一个js线程 2. 宏任务 script / setTimeOut /setInterval等 3. 微任务主要有promise等 4. 热…...

顺序表和链表的比较

这两个结构各有优势&#xff0c;相辅相成。 顺序表&#xff1a; 优点&#xff1a; 1.支持随机访问。 2.CPU高速缓存命中率更高。(物理空间连续) 缺点&#xff1a; 1.头部和中部插入和删除时间效率低(O(n))。 2.连续的物理空间&#xff0c;空间不够后需要增容&#xff1a…...

Java为什么只能单继承???

目录 先屡清楚继承和实现的区别&#xff1a; 分析原因&#xff1a; 多继承虽然能使子类同时拥有多个父类的特征&#xff0c;但是其缺点也是很显著的&#xff0c;主要有两方面&#xff1a; (1)如果在一个子类继承的多个父类中拥有相同名字的实例变量&#xff0c;子类在引用该…...

数据安全-分类分级 调研分析报告

目录 前言一、数据分类分级概述1.数据分类2.数据分级二、数据分类分级原则三、数据分类分级的框架和方法1.数据分类分级的框架2.分类标准分类常见的方法2.1 MECE2.2 线分法和面分法及混合分法2.3 数据主题域2.4 技术选型维度2.5 以业务应用维度2.6 信息安全隐私方面的分类法3.分…...

浏览器对象详解

文章目录浏览器对象详解一、参考资料二、认识浏览器运行态下的 js1.问&#xff1a;是否了解浏览器的执行态&#xff08;分层设计&#xff09;&#xff1f;2.BOM1.[location](https://developer.mozilla.org/zh-CN/docs/Web/API/Location)拓展方向&#xff1a;2.[History](https…...

异步电路后端实现流程(cdc signOff 后端做什么)

一种后端异步电路的signOff流程同步电路和异步电路分别signOff对于同步电路&#xff0c;后端会分析sta setup/hold&#xff0c;这里不在赘述。在该scenario下 异步电路是不会分析&#xff0c;也不会关注异步电路之间的走线在cdc scenario(mode)下sdc有一下设置&#xff1a;将所…...

Linux网络编程实战介绍

文章目录 前言一、Linux网络编程介绍二、文章目录总结前言 本专栏将为大家讲解Linux网络编程的知识,本专栏只需要有C语言基础即可学习,学习本专栏将大大提高你的C语言水平,当然了我也还会在ARM板子上进行实验将Linux驱动也和网络编程联系起来,方便大家去实现自己的项目。我…...

C++概述 课堂笔记

函数的重载在C语言中函数名是唯一的&#xff0c;不可以重复定义&#xff0c;当我们利用函数执行&#xff0c;功能相似的函数&#xff0c;我们也不能使用同一个函数&#xff0c;比如说&#xff0c;求整型的函数&#xff0c;不能用来求浮点型、字符型。在C中引入函数重载的概念&a…...

一文读懂SpringBoot整合Elasticsearch(一)

&#xff08;本篇文章主要介绍Spring Boot如何整合Elasticsearch&#xff0c;包括基本配置、数据操作、搜索功能等方面。&#xff09; 一、前言 Elasticsearch是一款全文搜索引擎&#xff0c;可用于快速、准确地存储、搜索和分析大量数据。而Spring Boot是一款快速开发框架&a…...

(数论)(枚举)(前缀和)1230. K倍区间

目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 1230. K倍区间 - AcWing题库 &#xff5e;数&#xff5e;啦&#xff01;我草&#xff0c;又~在&#xff5e;水&#xff5e;字&#xff5e;数&#xff5e;啦&#xff01;我草&#xff0c;又~在&#xff5e;水&…...

万字带你深入理解 Linux 虚拟内存管理(下)

接上文&#xff1a;万字带你深入理解 Linux 虚拟内存管理&#xff08;上&#xff09; 6. 程序编译后的二进制文件如何映射到虚拟内存空间中 经过前边这么多小节的内容介绍&#xff0c;现在我们已经熟悉了进程虚拟内存空间的布局&#xff0c;以及内核如何管理这些虚拟内存区域&…...

【iOS】—— JSONModel源码学习

JSONModel 文章目录JSONModel关于JSONModel的用法initWithDictionary等方法load方法实现load方法调用时机init方法__setup__方法__inspectProperties:方法__doesDictionary方法__importDictionary方法关于JSONModel的用法 可以参考之前写的博客&#xff1a;【iOS】—— JSONMo…...

单片机怎么实现真正的多线程?

所谓多线程都是模拟的&#xff0c;本质都是单线程&#xff0c;因为cpu同一时刻只能执行一段代码。模拟的多线程就是任务之间快速切换&#xff0c;看起来像同时执行的样子。据说最近有多核的单片机&#xff0c;不过成本应该会高很多。对于模拟的多线程&#xff0c;我知道的有两种…...

【LeetCode】剑指 Offer(23)

目录 题目&#xff1a;剑指 Offer 46. 把数字翻译成字符串 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 46. 把…...

[免费专栏] 汽车威胁狩猎之不应该相信的几个威胁狩猎误区

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 汽车威胁狩猎专栏长期更新&#xff0c;本篇最新内容请前往&#xff1a; …...

LinuxFTP文件传输服务和DNS域名解析服务

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

二叉搜索树原理及底层实现

二叉搜索树BST 概念 二叉搜索树又称二叉排序树&#xff0c;它可以是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a;若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值&#xff1b;若它的右子树不为空&#xff0c;则右子树上所有节点的值都…...

python自动化办公(一)

本文代码参考其他教程书籍实现。 文章目录文件读写open函数读取文本文件写入文本文件文件和目录操作使用os库使用shutil库文件读写 open函数 open函数有8个参数&#xff0c;常用前4个&#xff0c;除了file参数外&#xff0c;其他参数都有默认值。file指定了要打开的文件名称&a…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...