Matlab 根据点的密度对三维散点图进行颜色编码
我有一个xyz球体中点的三维散点图。我想知道是否有一种方法可以根据数据的密度对散点图进行着色/着色。基本上,散点图中聚集数据点最密集的部分为深红色,半密集聚集数据点为中红色,稀疏聚集数据点为浅红色 这是我一直在考虑的方法,但是(希望)可能有一个更简单的函数或命令来实现这一点 设置散布中的数据点必须被以下对象包围的阈值: [>=半径为1的球体内的10个其他点被涂成深红色 [5-9半径为1的球体内的其他点为中红色,以及 [0-4在半径为1的球体内,颜色为浅红色 当然,我希望有一种更简单的方法来实现这一点,即在颜色映射中包含3种以上的颜色,因此,如果有人对如何编写此代码有任何想法,我将非常感谢您的帮助!非常感谢 以下是我的数组的一个片段:Matlab 根据点的密度对三维散点图进行颜色编码,matlab,plot,scatter,colormap,density-plot,Matlab,Plot,Scatter,Colormap,Density Plot,我有一个xyz球体中点的三维散点图。我想知道是否有一种方法可以根据数据的密度对散点图进行着色/着色。基本上,散点图中聚集数据点最密集的部分为深红色,半密集聚集数据点为中红色,稀疏聚集数据点为浅红色 这是我一直在考虑的方法,但是(希望)可能有一个更简单的函数或命令来实现这一点 设置散布中的数据点必须被以下对象包围的阈值: [>=半径为1的球体内的10个其他点被涂成深红色 [5-9半径为1的球体内的其他点为中红色,以及 [0-4在半径为1的球体内,颜色为浅红色 当然,我希望有一种更简单的方法来实现这
184 115 3915
185 115 3916
185 115 1205
186 115 4094
187 115 2237
192 115 1519
193 115 1327
201 115 1170
240 115 2946
241 115 1332
54 116 1244
58 116 3650
59 116 3984
60 116 1631
61 116 1198
61 116 1194
62 116 1189
65 116 1185
186 116 3669
188 116 3986
189 116 2027
197 116 1200
201 116 1254
226 116 3752
227 116 1457
242 116 1405
54 117 1191
54 117 1305
56 117 1177
58 117 1169
61 117 1367
62 117 1428
62 117 1434
62 117 1435
63 117 1422
198 117 1197
229 117 1312
230 117 1179
243 117 1272
55 118 1236
56 118 1166
61 118 1191
65 118 1755
57 119 1213
57 119 1176
58 119 1253
62 119 1365
62 119 1331
63 119 1457
63 119 1251
66 119 1842
66 119 1468
59 120 1489
59 120 1387
60 120 1218
60 120 1224
61 120 1214
61 120 1440
62 120 1198
64 120 1240
205 120 3601
205 120 1168
206 120 3727
207 120 4089
208 120 2128
208 120 1160
56 121 1293
57 121 1183
59 121 1371
59 121 1347
61 121 1314
64 121 1346
207 121 3562
208 121 3845
209 121 3534
210 121 1201
210 121 1405
83 122 1794
206 122 1259
207 122 1161
83 123 3550
这是一个相当粗糙的函数,但我认为它实现的结果与您想要的结果类似
a=rand(1000,3);%创建随机矩阵,在此处使用数据
n=零(大小(a,1),1);%为附近点的数量设置数组
tol=0.2;(平方)距离的公差百分比应计为“附近”
sz=大小(a,1);%是数据大小的简写
%在每个点上循环
对于ii=1:sz;
距离=和((repmat(a(ii,:),sz,1)-a)。^2,2);%获得标准欧几里德距离
n(ii)=nnz(距离
输出:
在我的方法中,我使用阈值因子
T
来确定在计算每个点的距离时考虑了多少其他点。T=1
表示计算每个点到所有其他点的平均距离,T=0.01
表示每个点到cl的平均距离计算其他点中最接近1%的点
figure
%// example data
[X,Y,Z] = sphere(15);
x = [0.1*X(:); 0.4*X(:); 0.7*X(:)];
y = [0.2*Y(:); 0.5*Y(:); 0.8*Y(:)];
z = [0.3*Z(:); 0.6*Z(:); 0.9*Z(:)];
D = [x(:), y(:), z(:)];
N = numel(x);
%// calculation of color vector
[n,m] = ndgrid(1:N,1:N);
%// euclidian distance of each point to every other point
X = arrayfun(@(a,b) sum( (D(a,:) - D(b,:)).^2 ), n, m);
%% subplot 1
%// threshold factor
T = 0.01;
%// sort distances of points
Y = sort(X,2);
%// calculate average distance of the closest T% of all points
Z = mean(Y(:,2:ceil(N*T)),2);
%// plot
subplot(121)
scatter3(x,y,z,20,Z,'filled');
title('T = 0.01')
colormap
colorbar
%% subplot 2
%// threshold factor
T = 1;
Y = sort(X,2);
Z = mean(Y(:,2:ceil(N*T)),2);
%// plot
subplot(122)
scatter3(x,y,z,20,Z,'filled');
title('T = 1')
colormap
colorbar
谢谢你的这段代码!当我输入数据并尝试运行它时,当我的代码运行到这里时,我得到错误消息:“下标索引必须是实正整数或逻辑数”:dists=sum((repmat(a(ii,:),sz,1)-a)。^2,2);这是我的a数组的问题吗?我刚刚用你的随机数据尝试了代码,它仍然给我“下标索引必须是实正整数或逻辑数”错误。我认为这与sum命令有关……但我不确定。你准确地复制了for循环?你是否正确地设置了
sz
的值?如果我按原样运行代码,我不会得到该错误,当你得到错误时,尝试获得ii
的值。嗨-当我使用随机数据运行代码时,它工作得很好。然而,当我以完全相同的格式输入数据时,我得到错误“下标索引必须是实正整数或逻辑数。”我的数据有问题吗?非常感谢!我认为错误发生在dists=
行?请在问题的底部发布一段数据片段,以便我可以重现问题。调试时检查所有索引的值,看看其中一个是否不是整数…嗨,非常感谢你花时间帮助我解决问题t!我在想-这些线是什么意思/它们做什么?x=[0.1*x(:);0.4*x(:);0.7*x(:)];y=[0.2*y(:);0.5*y(:);0.8*y(:)];z=[0.3*z(:);0.6*z(:);0.9*z(:)];@Anonymous这只是示例数据,用您的数据替换x
、y
和z
!嗨,当我使用您的示例数据时,一切都很好。但是,当我使用自己的数据时,当我使用命令@(a,b)sum((D(a,:)-D(b,:)。^2),出现以下错误消息:下标索引必须是实正整数或逻辑数。您对可能出现的问题有何看法?非常感谢!类似/有用:
figure
%// example data
[X,Y,Z] = sphere(15);
x = [0.1*X(:); 0.4*X(:); 0.7*X(:)];
y = [0.2*Y(:); 0.5*Y(:); 0.8*Y(:)];
z = [0.3*Z(:); 0.6*Z(:); 0.9*Z(:)];
D = [x(:), y(:), z(:)];
N = numel(x);
%// calculation of color vector
[n,m] = ndgrid(1:N,1:N);
%// euclidian distance of each point to every other point
X = arrayfun(@(a,b) sum( (D(a,:) - D(b,:)).^2 ), n, m);
%% subplot 1
%// threshold factor
T = 0.01;
%// sort distances of points
Y = sort(X,2);
%// calculate average distance of the closest T% of all points
Z = mean(Y(:,2:ceil(N*T)),2);
%// plot
subplot(121)
scatter3(x,y,z,20,Z,'filled');
title('T = 0.01')
colormap
colorbar
%% subplot 2
%// threshold factor
T = 1;
Y = sort(X,2);
Z = mean(Y(:,2:ceil(N*T)),2);
%// plot
subplot(122)
scatter3(x,y,z,20,Z,'filled');
title('T = 1')
colormap
colorbar