Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 根据点的密度对三维散点图进行颜色编码_Matlab_Plot_Scatter_Colormap_Density Plot - Fatal编程技术网

Matlab 根据点的密度对三维散点图进行颜色编码

Matlab 根据点的密度对三维散点图进行颜色编码,matlab,plot,scatter,colormap,density-plot,Matlab,Plot,Scatter,Colormap,Density Plot,我有一个xyz球体中点的三维散点图。我想知道是否有一种方法可以根据数据的密度对散点图进行着色/着色。基本上,散点图中聚集数据点最密集的部分为深红色,半密集聚集数据点为中红色,稀疏聚集数据点为浅红色 这是我一直在考虑的方法,但是(希望)可能有一个更简单的函数或命令来实现这一点 设置散布中的数据点必须被以下对象包围的阈值: [>=半径为1的球体内的10个其他点被涂成深红色 [5-9半径为1的球体内的其他点为中红色,以及 [0-4在半径为1的球体内,颜色为浅红色 当然,我希望有一种更简单的方法来实现这

我有一个xyz球体中点的三维散点图。我想知道是否有一种方法可以根据数据的密度对散点图进行着色/着色。基本上,散点图中聚集数据点最密集的部分为深红色,半密集聚集数据点为中红色,稀疏聚集数据点为浅红色

这是我一直在考虑的方法,但是(希望)可能有一个更简单的函数或命令来实现这一点

设置散布中的数据点必须被以下对象包围的阈值:

[>=半径为1的球体内的10个其他点被涂成深红色

[5-9半径为1的球体内的其他点为中红色,以及

[0-4在半径为1的球体内,颜色为浅红色

当然,我希望有一种更简单的方法来实现这一点,即在颜色映射中包含3种以上的颜色,因此,如果有人对如何编写此代码有任何想法,我将非常感谢您的帮助!非常感谢

以下是我的数组的一个片段:

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