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)
本期部分实验效果: 这期讲一下如果数据重合严重该咋办(overlap),事先说明,本文中的绘图均使用一个几行的简单小代码进行了修饰: 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 项目发布初期,它的部署完全要依靠一堆由社区维护…...
[jS 事件循环理解] 主线程 宏任务 微任务 - 执行顺序优先级理解
最近看了一个帖子 事件循环机制-宏任务-微任务 把js单线程中 , 主线程 | 宏任务 | 微任务 的调用顺序讲解的很直白精巧 , 记录一下以供查阅 1.主线程, 可以理解为从上到下顺序执行的一个js线程 2. 宏任务 script / setTimeOut /setInterval等 3. 微任务主要有promise等 4. 热…...
顺序表和链表的比较
这两个结构各有优势,相辅相成。 顺序表: 优点: 1.支持随机访问。 2.CPU高速缓存命中率更高。(物理空间连续) 缺点: 1.头部和中部插入和删除时间效率低(O(n))。 2.连续的物理空间,空间不够后需要增容:…...
Java为什么只能单继承???
目录 先屡清楚继承和实现的区别: 分析原因: 多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面: (1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该…...
数据安全-分类分级 调研分析报告
目录 前言一、数据分类分级概述1.数据分类2.数据分级二、数据分类分级原则三、数据分类分级的框架和方法1.数据分类分级的框架2.分类标准分类常见的方法2.1 MECE2.2 线分法和面分法及混合分法2.3 数据主题域2.4 技术选型维度2.5 以业务应用维度2.6 信息安全隐私方面的分类法3.分…...
浏览器对象详解
文章目录浏览器对象详解一、参考资料二、认识浏览器运行态下的 js1.问:是否了解浏览器的执行态(分层设计)?2.BOM1.[location](https://developer.mozilla.org/zh-CN/docs/Web/API/Location)拓展方向:2.[History](https…...
异步电路后端实现流程(cdc signOff 后端做什么)
一种后端异步电路的signOff流程同步电路和异步电路分别signOff对于同步电路,后端会分析sta setup/hold,这里不在赘述。在该scenario下 异步电路是不会分析,也不会关注异步电路之间的走线在cdc scenario(mode)下sdc有一下设置:将所…...
Linux网络编程实战介绍
文章目录 前言一、Linux网络编程介绍二、文章目录总结前言 本专栏将为大家讲解Linux网络编程的知识,本专栏只需要有C语言基础即可学习,学习本专栏将大大提高你的C语言水平,当然了我也还会在ARM板子上进行实验将Linux驱动也和网络编程联系起来,方便大家去实现自己的项目。我…...
C++概述 课堂笔记
函数的重载在C语言中函数名是唯一的,不可以重复定义,当我们利用函数执行,功能相似的函数,我们也不能使用同一个函数,比如说,求整型的函数,不能用来求浮点型、字符型。在C中引入函数重载的概念&a…...
一文读懂SpringBoot整合Elasticsearch(一)
(本篇文章主要介绍Spring Boot如何整合Elasticsearch,包括基本配置、数据操作、搜索功能等方面。) 一、前言 Elasticsearch是一款全文搜索引擎,可用于快速、准确地存储、搜索和分析大量数据。而Spring Boot是一款快速开发框架&a…...
(数论)(枚举)(前缀和)1230. K倍区间
目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 1230. K倍区间 - AcWing题库 ~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水&…...
万字带你深入理解 Linux 虚拟内存管理(下)
接上文:万字带你深入理解 Linux 虚拟内存管理(上) 6. 程序编译后的二进制文件如何映射到虚拟内存空间中 经过前边这么多小节的内容介绍,现在我们已经熟悉了进程虚拟内存空间的布局,以及内核如何管理这些虚拟内存区域&…...
【iOS】—— JSONModel源码学习
JSONModel 文章目录JSONModel关于JSONModel的用法initWithDictionary等方法load方法实现load方法调用时机init方法__setup__方法__inspectProperties:方法__doesDictionary方法__importDictionary方法关于JSONModel的用法 可以参考之前写的博客:【iOS】—— JSONMo…...
单片机怎么实现真正的多线程?
所谓多线程都是模拟的,本质都是单线程,因为cpu同一时刻只能执行一段代码。模拟的多线程就是任务之间快速切换,看起来像同时执行的样子。据说最近有多核的单片机,不过成本应该会高很多。对于模拟的多线程,我知道的有两种…...
【LeetCode】剑指 Offer(23)
目录 题目:剑指 Offer 46. 把数字翻译成字符串 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:剑指 Offer 46. 把…...
[免费专栏] 汽车威胁狩猎之不应该相信的几个威胁狩猎误区
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 汽车威胁狩猎专栏长期更新,本篇最新内容请前往: …...
LinuxFTP文件传输服务和DNS域名解析服务
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...
二叉搜索树原理及底层实现
二叉搜索树BST 概念 二叉搜索树又称二叉排序树,它可以是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;若它的右子树不为空,则右子树上所有节点的值都…...
python自动化办公(一)
本文代码参考其他教程书籍实现。 文章目录文件读写open函数读取文本文件写入文本文件文件和目录操作使用os库使用shutil库文件读写 open函数 open函数有8个参数,常用前4个,除了file参数外,其他参数都有默认值。file指定了要打开的文件名称&a…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
