MATLAB散点密度图的画法一

编程入门 行业动态 更新时间:2024-10-24 20:21:48

MATLAB散点密度图的<a href=https://www.elefans.com/category/jswz/34/1713450.html style=画法一"/>

MATLAB散点密度图的画法一

散点密度图的效果如下:

画这样的图可以用scatplot函数即可,这个函数不是MATLAB自带的函数,是MATLAB论坛上提供的,链接在文尾。

函数用法

out = scatplot(x,y,method,radius,N,n,po,ms)
out = scatplot(x,y,dd)

参数含义:

%%  x,y 
% 是输入变量%%   method- 是计算数据密度的方法(三种):
% 'circles' - 使用圆圈确定的面积以每个数据点为中心 
% 'squares' - 使用具有确定面积的正方形,以每个数据点为中心
% 'voronoi' - 使用 voronoi 单元来确定数据密度
% 默认方法是 'voronoi'%% radius - 此参数为计算数据密度的半径
% 仅用于方法为 'circles'和 'squares'时
% 默认半径是 sqrt((range(x)/30)^2 + (range(y)/30)^2)%% N - 是用于
%的方形网格 (N x N) 的大小,过滤并计算轮廓
% 默认为 100%% n - 是 2-D
% 运行平均过滤器中 使用的系数数量
% 默认为 5
%(注意:如果 n 是长度(2),n(2)是应用过滤器的次数百分比)%% po - 绘图选项:
% 0 - 不绘图
% 1 - 仅绘制彩色数据点(过滤)
% 2 - 绘制彩色数据点和等高线(过滤)
% 3 - 仅绘制彩色数据点(未过滤)
% 4 - 绘制彩色图数据点和轮廓(未过滤)
% 默认值为 1%% ms - 数据点大小
% 默认值为 4%% 输出变量:
% out - 包含以下字段的结构数组:
% dd - (x) 处的未过滤数据密度,y)
% ddf - (x,y)
% 半径处的过滤数据密度 - 用于“圆形”和“正方形”的区域
% 计算密度的方法
% xi - x 坐标为 zi 矩阵
% yi - y 坐标为 zi 矩阵
% zi - (xi,yi) 处的未过滤数据密度 % zif - (xi,yi) 处的过滤数据密度
% [c,h ] =CONTOURC 中描述的轮廓矩阵 C 和轮廓组 对象的句柄 H
% hs = 散点句柄

函数代码(将所有代码复制并重命名为scatplot.m即可使用)

function out = scatplot(x,y,method,radius,N,n,po,ms)
% Scatter plot with color indicating data density
%
% USAGE:
%   out = scatplot(x,y,method,radius,N,n,po,ms)
%   out = scatplot(x,y,dd)
%
% DESCRIPTION:
%   Draws a scatter plot with a colorscale 
%   representing the data density computed 
%   using three methods
%
% INPUT VARIABLES:
%   x,y - are the data points
%   method - is the method used to calculate data densities:
%       'circles' - uses circles with a determined area 
%               centered at each data point
%       'squares' - uses squares with a determined area 
%               centered at each data point
%       'voronoi' - uses voronoi cells to determin data densities
%               default method is 'voronoi'
%   radius - is the radius used for the circles or squares
%       used to calculate the data densities if
%       (Note: only used in methods 'circles' and 'squares'
%           default radius is sqrt((range(x)/30)^2 + (range(y)/30)^2)
%   N - is the size of the square mesh (N x N) used to  
%       filter and calculate contours
%       default is 100
%   n - is the number of coeficients used in the 2-D
%       running mean filter
%       default is 5
%       (Note: if n is length(2), n(2) is tjhe number of
%       of times the filter is applied)
%   po - plot options:
%       0 - No plot
%       1 - plots only colored data points (filtered)
%       2 - plots colored data points and contours (filtered)
%       3 - plots only colored data points (unfiltered)
%       4 - plots colored data points and contours (unfiltered)
%           default is 1
%   ms - uses this marker size for filled circles
%       default is 4
%
% OUTPUT VARIABLE:
%   out - structure array that contains the following fields:
%       dd - unfiltered data densities at (x,y)
%       ddf - filtered data densities at (x,y)
%       radius - area used in 'circles' and 'squares'
%               methods to calculate densities
%       xi - x coordenates for zi matrix 
%       yi - y coordenates for zi matrix
%       zi - unfiltered data densities at (xi,yi)
%       zif - filtered data densities at (xi,yi)
%       [c,h] = contour matrix C as described in
%           CONTOURC and a handle H to a contourgroup object
%       hs = scatter points handles
%
%Copy-Left, Alejandro Sanchez-Barba, 2005if nargin==0scatplotdemoreturn
end
if nargin<3 | isempty(method)method = 'vo';
end
if isnumeric(method)gsp(x,y,method,2)return
elsemethod = method(1:2);
end
if nargin<4 | isempty(n)n = 5; %number of filter coefficients
end
if nargin<5 | isempty(radius)radius = sqrt((range(x)/30)^2 + (range(y)/30)^2);
end
if nargin<6 | isempty(po)po = 1; %plot option
end
if nargin<7 | isempty(ms)ms = 4; %markersize
end
if nargin<8 | isempty(N)N = 100; %length of grid
end
%Correct data if necessary
x = x(:);
y = y(:);
%Asuming x and y match
idat = isfinite(x);
x = x(idat);
y = y(idat);
holdstate = ishold;
if holdstate==0cla
end
hold on
%--------- Caclulate data density ---------
dd = datadensity(x,y,method,radius);
%------------- Gridding -------------------
xi = repmat(linspace(min(x),max(x),N),N,1);
yi = repmat(linspace(min(y),max(y),N)',1,N);
zi = griddata(x,y,dd,xi,yi);
%----- Bidimensional running mean filter -----
zi(isnan(zi)) = 0;
coef = ones(n(1),1)/n(1);
zif = conv2(coef,coef,zi,'same');
if length(n)>1for k=1:n(2)zif = conv2(coef,coef,zif,'same');end
end
%-------- New Filtered data densities --------
ddf = griddata(xi,yi,zif,x,y);
%----------- Plotting --------------------
switch pocase {1,2}if po==2[c,h] = contour(xi,yi,zif);out.c = c;out.h = h;end %ifhs = gsp(x,y,ddf,ms);out.hs = hs;colorbarcase {3,4}if po>3[c,h] = contour(xi,yi,zi);out.c = c;end %ifhs = gsp(x,y,dd,ms);out.hs = hs;colorbar    
end %switch
%------Relocate variables and place NaN's ----------
dd(idat) = dd;
dd(~idat) = NaN;
ddf(idat) = ddf;
ddf(~idat) = NaN;
%--------- Collect variables ----------------
out.dd = dd;
out.ddf = ddf;
out.radius = radius;
out.xi = xi;
out.yi = yi;
out.zi = zi;
out.zif = zif;
if ~holdstatehold off
end
return
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function scatplotdemo
po = 2;
method = 'squares';
radius = [];
N = [];
n = [];
ms = 5;
x = randn(1000,1);
y = randn(1000,1);out = scatplot(x,y,method,radius,N,n,po,ms)return
%~~~~~~~~~~ Data Density ~~~~~~~~~~~~~~
function dd = datadensity(x,y,method,r)
%Computes the data density (points/area) of scattered points
%Striped Down version
%
% USAGE:
%   dd = datadensity(x,y,method,radius)
%
% INPUT:
%   (x,y) -  coordinates of points
%   method - either 'squares','circles', or 'voronoi'
%       default = 'voronoi'
%   radius - Equal to the circle radius or half the square width
Ld = length(x);
dd = zeros(Ld,1);
switch method %Calculate Data Densitycase 'sq'  %---- Using squares ----for k=1:Lddd(k) = sum( x>(x(k)-r) & x<(x(k)+r) & y>(y(k)-r) & y<(y(k)+r) );end %forarea = (2*r)^2;dd = dd/area;case 'ci'for k=1:Lddd(k) = sum( sqrt((x-x(k)).^2 + (y-y(k)).^2) < r );endarea = pi*r^2;dd = dd/area;case 'vo'  %----- Using voronoi cells ------[v,c] = voronoin([x,y]);     for k=1:length(c) %If at least one of the indices is 1, %then it is an open region, its area%is infinity and the data density is 0if all(c{k}>1)   a = polyarea(v(c{k},1),v(c{k},2));dd(k) = 1/a;end %ifend %for
end %switch
return
%~~~~~~~~~~ Graf Scatter Plot ~~~~~~~~~~~
function varargout = gsp(x,y,c,ms)
%Graphs scattered poits
map = colormap;
ind = fix((c-min(c))/(max(c)-min(c))*(size(map,1)-1))+1;
h = [];
%much more efficient than matlab's scatter plot
for k=1:size(map,1) if any(ind==k)h(end+1) = line('Xdata',x(ind==k),'Ydata',y(ind==k), ...'LineStyle','none','Color',map(k,:), ...'Marker','.','MarkerSize',ms);end
end
if nargout==1varargout{1} = h; 
end
return

 函数来源:scatplot - File Exchange - MATLAB Central

更多推荐

MATLAB散点密度图的画法一

本文发布于:2023-07-28 19:54:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1293600.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:画法   密度   MATLAB

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!