1

除了 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)的特定颜色的正确方法是什么?

4

2 回答 2

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 可能对此感到困惑,您的代码的任何未来读者肯定会对此感到困惑。

于 2012-10-03T11:47:28.727 回答
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 的索引。

您可以size对 scatter3 的参数使用标量,而不是指定单个值的数组。

于 2012-10-03T12:18:50.910 回答