在3D散点图上显示具有不同颜色的类别

时间:2012-10-03 11:29:02

标签: matlab

除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)?

2 个答案:

答案 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参数,而不是指定单个值的数组。