基于matlab的密度散点图绘制

news2025/1/18 19:11:57

1. 什么是密度散点图?

密度散点图就是在普通散点图的基础上,基于样本点一定范围的样本数计算该样本点的密度,以不同的颜色来显示样本点密度的大小,这样能够直观的显示出数据的空间聚集情况,如下图分别是二维和三维密度散点图

8425425e7e3938936bf724a74fc0402

Matlab进阶绘图第25期—三维密度散点图

2. 密度散点图绘制思路

2.1 网格划分

以二维散点图为例,将坐标轴范围划分为一系列大小相同的格网,统计每一个格网内部的样本点数除以格网面积,将所得结果作为该格网内样本点的密度,根据实际需要决定是否需要将密度进行归一化处理,这种方法计算量小,效率高,但效果相对较差

2.2 空间搜索

以二维散点图为例,对某一样本点搜索给定半径范围内的样本数,样本数除以搜索圆的面积作为样本点的密度,同样根据实际使用需要决定是否需要将密度进行归一化处理,这种方法计算量大,效率较低,但效果更好

3. matlab绘制密度散点图

基于网格划分的密度计算函数

function density = density_Grid(data,nd)
% 功能:利用格网划分提取离散点密度特征
% 输入:data   - 原始数据
% 输入:nd - 划分格网数
% 输出:density - 样本密度向量 
M = size(data,1);
N = size(data,2);
data_max = max(data);
data_min = min(data);
data_interval = (data_max - data_min)/nd;
if N == 2
    data_freq = zeros(nd,nd);
    data_index = zeros(M,N);
    for i = 1:M
        x = data(i,1);
        y = data(i,2);
        c = min(floor((x - data_min(1))/data_interval(1))+1,nd);
        r = min(floor((data_max(2)-y)/data_interval(2))+1,nd);
        data_freq(r,c) = data_freq(r,c)+1;
        data_index(i,:) = [r,c]; 
    end
else
    data_freq = zeros(nd,nd,nd);
    for i = 1:M
        x = data(i,1);
        y = data(i,2);
        z = data(i,3);
        c = min(floor((x - data_min(1))/data_interval(1))+1,nd);
        r = min(floor((data_max(2)-y)/data_interval(2))+1,nd);
        v = min(floor((z - data_min(3))/data_interval(3))+1,nd);
        data_freq(r,c,v) = data_freq(r,c,v)+1;
        data_index(i,:) = [r,c,v];
    end
end
s = 1;
for i = 1:N
    s = s * data_interval(i);
end
data_freq = data_freq./s;
density = zeros(M,1);
if N==2
    for i = 1:M
        r = data_index(i,1);
        c = data_index(i,2);
        density(i,1) = data_freq(r,c);
    end
else
    for i = 1:M
        r = data_index(i,1);
        c = data_index(i,2);
        v = data_index(i,3);
        density(i,1) = data_freq(r,c,v);
    end
end
% 密度归一化
max_density = max(density);
density = density./max_density;
end

基于空间搜索的密度计算函数

function density = density_KD(data,radius)
% 功能:利用KD树提取离散点密度特征
% 输入:data   - 原始数据
% 输入:radius - 搜索半径
% 输出:density - 样本密度向量 
M = size(data,1);
N = size(data,2);
density = zeros(M,1);
idx = rangesearch(data(:,1:N),data(:,1:N),radius,'Distance','euclidean','NSMethod','kdtree');
if N=2
	s = pi*radius^2
else
	s = 3/4*pi*radius^3
end
for i = 1:M
    density(i,1) = length(idx{i})/s;
end
% 密度归一化
max_density = max(density);
density = density./max_density;
end

绘图函数

% 数据读取
% xbly_data = readtable("xiboliya.xlsx");
% xbly_data = table2array(xbly_data)
% xbly_a = xbly_data(:,2);
% xbly_dem = xbly_data(:,3);
% xbly_slope = xbly_data(:,4);
% xbly_ndvi = xbly_data(:,5);
% scatterDensity(xbly_slope(1:10:528523),xbly_a(1:10:528523),"slope","a")
function scatterDensity(x,y,xtitle,ytitle)
data=[x,y];
density_2D = density_KD(data(:,1:2),1);%将density2D_KD放在该代码同一路径下
% density_2D = density_Grid(data(:,1:2),40000);
scatter(x,y,10, density_2D, '.');
%设置色带
colormap('jet');
hXLabel = xlabel(xtitle);
hYLabel = ylabel(ytitle);
% 坐标轴美化
set(gca, 'Box', 'on', ...                                        % 边框
        'XGrid', 'off', 'YGrid', 'off', ...                      % 网格
        'TickDir', 'in', 'TickLength', [.015 .015], ...          % 刻度
        'XMinorTick', 'on', 'YMinorTick', 'on', 'YTick', 0:2:10,'YLim', [0,10]);            % 小刻度
% 字体和字号
set(gca, 'FontName', 'TimesNewRoma')
set([hXLabel, hYLabel],'FontName', 'TimesNewRoma')
set(gca, 'FontSize', 10)
set(gca, 'FontName', 'TimesNewRoma')
set([hXLabel, hYLabel],'FontSize', 11)
% 背景颜色
set(gca,'Color',[0 0 1]);
%设置色带显示
c = colorbar;
set(c,'tickdir','out');
%色带坐标范围及显示间隔
set(c,'YTick',0:0.2:1.0); 
% 保存结果
% saveas(gcf,strcat(xtitle,"_",ytitle,".fig"));
end

网格划分

slope_a1

空间搜索

slope_a

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1447506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年世界听力日活动的主题是什么?

改变思维模式:让所有人的耳和听力保健成为现实! Let’s make ear and hearing care a reality for all! 据 世界卫生组织 报道:在全球范围内,超过 80% 的耳和听力保健需求仍未得到满足 ; 未得到解决的听力损失每…

「计算机网络」数据链路层

数据链路层的地位:网络中的主机、路由器等都必须实现数据链路层信道类型 点对点信道:使用一对一的点对点通信方式广播信道 使用一对多的广播通信方式必须使用专用的共享信道协议来协调这些主机的数据发送 使用点对点信道的数据链路层 数据链路和帧 链…

ubuntu下如何查看显卡及显卡驱动

ubuntu下如何查看显卡及显卡驱动 使用nvidia-smi 工具查看 查看显卡型号nvida-smi -L $ nvidia-smi -L GPU 0: NVIDIA GeForce RTX 3050 4GB Laptop GPU (UUID: GPU-4cf7b7cb-f103-bf56-2d59-304f8996e28c)当然直接使用nvida-smi 命令可以查看更多信息 $ nvidia-smi Mon Fe…

【Ubuntu】在.bashrc文件中误设置环境变量补救方法

这里是vim也不在PATH中了,因为 解决方法就是在输入vim之后提示的vim路径下用vim打开该文件,然后改回来

C++基础入门:掌握核心概念(超全!)

C作为一门广泛使用的编程语言,以其高性能和灵活性在软件开发领域占据重要地位。无论是游戏开发、系统编程还是实时应用,C都是一个不可或缺的工具。本博客旨在为初学者提供C编程语言的核心概念,帮助你建立坚实的基础。 C关键字 C关键字是编程…

SPP改进(多窗口池化)

论文创新点汇总:人工智能论文通用创新点(持续更新中...)-CSDN博客 原来的模型 15年提出 本质: 多个不同大小的池化窗口进行池化 池化窗口越大得到的特征越少 之后再将不同池化窗口得到的特征拼接起来 现在的改进 实现代码 class SPPCSPC(nn.Modul…

【python】网络爬虫与信息提取--Beautiful Soup库

Beautiful Soup网站:https://www.crummy.com/software/BeautifulSoup/ 作用:它能够对HTML.xml格式进行解析,并且提取其中的相关信息。它可以对我们提供的任何格式进行相关的爬取,并且可以进行树形解析。 使用原理:它能…

Linux_线程

线程与进程 多级页表 线程控制 线程互斥 线程同步 生产者消费者模型 常见概念 下面选取32位系统举例。 一.线程与进程 上图是曾经我们认为进程所占用的资源的集合。 1.1 线程概念 线程是一个执行分支,执行粒度比进程细,调度成本比进程低线程是cpu…

LeetCode、739. 每日温度【中等,单调栈】

文章目录 前言LeetCode、739. 每日温度【中等,单调栈】题目链接及分类思路单调栈 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技…

python算法之 Dijkstra 算法

文章目录 基本思想:步骤:复杂度:注意事项:代码实现K 站中转内最便宜的航班 Dijkstra 算法是一种用于解决单源最短路径问题的经典算法。该问题的目标是找到从图中的一个固定顶点(称为源点)到图中所有其他顶点…

vue三种路由守卫详解

在 Vue 中,可以通过路由守卫来实现路由鉴权。Vue 提供了三种路由守卫:全局前置守卫、全局解析守卫和组件内的守卫。 全局前置守卫 通过 router.beforeEach() 方法实现,可以在路由跳转之前进行权限判断。在这个守卫中,可以根据用…

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示

对上一篇的工作C学习笔记 | 基于Qt框架开发实时成绩显示排序系统1-CSDN博客继续优化,增加一个显示运动员每组成绩的折线图。 1)在Qt Creator的项目文件(.pro文件)中添加对Qt Charts模块的支持: QT charts 2&#xf…

【动态规划】【中位数】【C++算法】1478. 安排邮筒

# 作者推荐 【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目 本文涉及知识点 动态规划汇总 LeetCode1478. 安排邮筒 给你一个房屋数组houses 和一个整数 k ,其中 houses[i] 是第 i 栋房子在一条街上的位置,现需要在这条街上安排 k…

Linux_文件系统

假定外部存储设备为磁盘,文件如果没有被使用,那么它静静躺在磁盘上,如果它被使用,则文件将被加载进内存中。故此,可以将文件分为内存文件和磁盘文件。 内存文件 磁盘文件 软、硬链接 一.内存文件 1.1 c语言的文件接口 …

波奇学Linux:文件系统

磁盘认识 磁盘被访问的基本单元是扇区-512字节。 磁盘可以看成多个同心圆,每个同心圆叫做磁道,多个扇区组成同心圆。 我们可以把磁盘看做由无数个扇区构成的存储介质。 要把数据存到磁盘,先定位扇区,用哪一个磁头,…

算法沉淀——链表(leetcode真题剖析)

算法沉淀——链表 01.两数相加02.两两交换链表中的节点03.重排链表04.合并 K 个升序链表05.K个一组翻转链表 链表常用技巧 1、画图->直观形象、便于理解 2、引入虚拟"头节点" 3、要学会定义辅助节点(比如双向链表的节点插入) 4、快慢双指针…

高效的工作学习方法

1.康奈尔笔记法 在这里插入图片描述 2. 5W2H法 3. 鱼骨图分析法 4.麦肯锡7步分析法 5.使用TODOLIST 6.使用计划模板(年月周) 7. 高效的学习方法 成年人的学习特点: 快速了解一个领域方法 沉浸式学习方法: 沉浸学习的判据&am…

MATLAB知识点:fibonacci函数(★☆☆☆☆)返回斐波那契数列

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章:课后习题讲解中拓展的函数 在讲解第…

C++ //练习 5.12 修改统计元音字母的程序,使其能统计以下含有两个字符的字符序列的数量:ff、fl和fi。

C Primer(第5版) 练习 5.12 练习 5.12 修改统计元音字母的程序,使其能统计以下含有两个字符的字符序列的数量:ff、fl和fi。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /****…

学习总结11

KMP算法 全称Knuth-Morris-Pratt算法,是一种字符串匹配算法。该算法的目的是在一个文本串S内查找一个模式串P的出现位置。 KMP算法的核心思想是利用模式串自身的特性来避免不必要的字符比较。算法通过构建一个部分匹配表(也称为next数组)&a…