除3个数值外,数据还包含分类值(0或1),并希望使用3D散点图显示数据。我试图编写一个函数来读取csv文件中的数据,并按以下方式创建散点图:
function f = ScatterPlotUsers(filename)
data = ReadCSV(filename);
x = data(:,2);
y = data(:,3);
z = data(:,4);
size = ones(length(x), 1)*20;
userType = data(:,5);
colors = zeros(length(x), 1);
a = find(userType == 1);
b = find(userType == 0);
colors(a,1) = 42; %# color for users type a
colors(b,1) = 2; %# color for users type b
scatter3(x(:),y(:),z(:),size, colors,'filled')
view(-60,60);
我真正想要做的是将a的颜色设置为红色,将b设置为蓝色,但无论颜色值(示例中为42和2),点的颜色都不会改变。 有谁知道确定几个分类值的特定颜色的正确方法是什么(在这种情况下只有0和1)?
答案 0 :(得分:2)
你做得对,但是,你确定色彩图条目42和2是指红色和蓝色吗?您可以尝试明确地给出RGB值:
colors = zeros(length(x), 3);
colors(userType == 1, :) = [1 0 0]; %# colour for users type a (red)
colors(userType == 2, :) = [0 0 1]; %# colour for users type b (blue)
另外,我建议你更改变量size
的名称,因为size
也是一个Matlab命令; Matlab可能会对此感到困惑,任何未来的代码读者都会当然对此感到困惑。
答案 1 :(得分:2)
我会使用色彩映射,尤其是当您的userType
值从0开始并增加时:
% Read in x, y, z, and userType.
userType = userType + 1;
colormap(lines(max(userType)));
scatter3(x, y, z, 20, userType);
如果您需要特定颜色,请用矩阵替换lines(...)
。例如,如果您有3种用户类型,并且您希望它们为红色,绿色和蓝色:
colormap([1, 0, 0;
0, 1, 0;
0, 0, 1]);
其他几点说明:
我们在userType
中添加一个,以便从基于0的索引切换到基于1的索引。
您可以使用标量作为scatter3的size
参数,而不是指定单个值的数组。