问题:
使用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
结果:
示例数据:
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
答案 0 :(得分:1)
如果所有标记都是相同的颜色,或者只有几种不同的颜色,那么使用// usage on whole data object
lineData.setValueFormatter(new GreaterThanZeroValueFormatter());
// usage on individual dataset object
lineDataSet.setValueFormatter(new GreaterThanZeroValueFormatter());
代替line
会更有效率;后者为每个标记创建一个句柄,scatter3
有一个句柄用于所有点。 line
有很多分可以让Matlab停下来。
使用scatter3
时添加的奖励是图例按预期工作:
line