使用for循环MATLAB时,scatter3中的系列颜色与Legend不匹配

问题:

使用for循环后,scatter3图中的图例颜色与系列颜色不匹配.

背景:

我正在编写一个脚本来生成基于实验数据的3d图.我也处理R中的数据.因此,数据被格式化为data.frame(即具有标题的nx7 CSV是值增益成本,熵,风险,可信度,算法,颜色,pch).我希望得到的三维散点图为每个观察点(即每个[x,y,z]元素)添加一个点,并根据其pch值对其进行着色(例如,所有pch == 1的观测值应该是相同的颜色).

码:

%get & count unique pch values ommitting NANs
UniquePchVal =transpose(unique(pch));
numberOfUniquePchVals=length(UniquePchVal(~isnan(UniquePchVal)))
UniquePchVal = UniquePchVal(1:numberOfUniquePchVals);

% get boolean vector for each series to indicate which observations should
% are to be included
numberOfObservations=length(pch)
UniquePchValMatrix = repmat(UniquePchVal,numberOfObservations,1);
pchMatrix=repmat(pch,1,numberOfUniquePchVals);
rows=UniquePchValMatrix(1:numberOfObservations,1:numberOfUniquePchVals);
rows =(rows==pchMatrix);

%make the plot
hold on
for i=1:numberOfUniquePchVals
   x=ValueGain(rows(:,i));
   y=Cost(rows(:,i));
   z=Risk(rows(:,i));
   size=repmat(20,length(x),1);
   color=repmat(i,length(x),1);
   h(i)=scatter3(x,y,z,size,color,'filled');
end
xlabel('Value Gain')
ylabel('Cost')
zlabel('Risk')
legend(h,unique(algorithm))
hold off

结果:

执行代码会生成一个图例,其中每个点都是相同的颜色.
《使用for循环MATLAB时,scatter3中的系列颜色与Legend不匹配》

样本数据:

Value Gain  Cost    Entropy Risk    Credibility algorithm   color   pch
-0.0    0.0 -0.0    0.0 -0.0    MOEAD   orange  3
-1.39838    1.44    -1.0    2.55555 -1.0    MOEAD   orange  3
-1.41319    4.15    -1.0    1.55555 -1.0    MOEAD   orange  3
-1.39593    3.84    -1.0    1.55555 -1.0    MOEAD   orange  3
-1.25189    1.11    -0.5    1.55555 -1.0    IBEA    cornflowerblue  4
-1.43183    2.87    -0.5    2.55555 -1.0    IBEA    cornflowerblue  4
-1.38953    1.43    -1.0    1.55555 -1.0    NSGA2   #fb8072 5
-1.39585    1.13    -0.33333    1.55555 -1.0    NSGA2   #fb8072 5
-1.1792 1.0 -0.2    2.55555 -1.0    NSGA2   #fb8072 5
-1.38244    1.14    -1.0    1.55555 -1.0    NSGA2   #fb8072 5
-0.05665    0.89    -1.0    2.55543 -1.0    NSGA2   #fb8072 5
-0.1175 0.9 -0.5    1.55556 -1.0    NSGA2   #fb8072 5
-0.06518    0.75    -0.33333    1.55555 -1.0    NSGA2   #fb8072 5
-0.51192    0.98    -0.5    1.55555 -1.0    NSGA2   #fb8072 5
-0.77432    0.98    -1.0    2.55555 -1.0    NSGA2   #fb8072 5
-0.82269    0.94    -0.25   2.55555 -1.0    NSGA2   #fb8072 5
-0.92626    1.0 -1.0    1.55555 -1.0    NSGA2   #fb8072 5

最佳答案 如果所有标记都是相同的颜色,或者只有少数不同的颜色,那么使用line而不是scatter3会更有效;后者为每个标记创建一个句柄,行有一个句柄用于所有点.具有多个点的scatter3可以使Matlab停止.

使用line时添加的奖励是图例按预期工作:

colors = ['r','g','b'];
hold on
h = [];
for ii = 1:3
    x = rand(10,1);
    y = rand(10,1);
    z = rand(10,1);
    h(ii) = line(x,y,z);
    set(h(ii),...
        'Marker','.',...
        'MarkerEdgeColor',colors(ii),...
        'MarkerFaceColor',colors(ii),...
        'MarkerSize',10,...
        'LineStyle','none')
end
legend('a','b','c')
点赞