在Mathematica中根据标签对绘图进行着色

5

我有一个带有标签的数据集,我想用点的颜色来表示它们的标签。有没有一种简单的方法可以在绘图中获取当前行数,以便确定该点属于哪个类别?

我知道x,y,z是绘制数据的坐标,但对于外部标签来说没什么用。

这相当丑陋,并且只适用于带有有规律分布的排序数据集。

    data = Import["http://ftp.ics.uci.edu/pub/machine-learning-databases/iris/iris.data"];
    data = Drop[data, -1]; (*there one extra line at the end*)
    inData = data[[All, 1 ;; 4]];
    labels = data[[All, 5]];
    ListPlot3D[inData,
      ColorFunction -> 
        Function[{x, y, z}, 
          If[y < 0.33, RGBColor[1, 1, 0.], 
               If[y < 0.66, RGBColor[1, 0, 0.], RGBColor[1, 0, 1]]
          ]
        ]
    ]

预期结果:

可视化的预期结果


1
你的数据集中的标签在哪里?请描述一下结构。 - Dr. belisarius
标签是字符串,可以用数字或RGB颜色替换,这并不重要。 - Tombart
问题仍不是完全清晰的,提供一个样本数据集会很好。您需要绘制单独的点还是曲面?数据格式是什么?建议:您能否根据类别分离您的点,并将每个类别单独绘制出来?GatherBy可能会有用。 - Szabolcs
我已经编辑了问题,希望现在更加清晰明了。在这种情况下,我更喜欢使用表面图,因为它似乎更容易理解。有4个参数使得可视化更加困难。选择其中3个参数进行可视化也是一个选项。 - Tombart
List...3D[{ }]将以三元组作为输入。您在inData中有四维向量。 - Dr. belisarius
2个回答

5
假设points是坐标列表,labels是相应标签的列表,例如:
points = Flatten[Table[{i, j, Sin[i j]}, 
   {i, 0, Pi, Pi/20}, {j, 0, Pi, Pi/10}], 1];
labels = RandomChoice[{"label a", "label b", "label c"}, Length[points]];

每个标签都对应一种颜色,我将其写成规则列表,例如:

rules = {"label a" -> RGBColor[1, 1, 0], 
   "label b" -> RGBColor[1, 0, 0], "label c" -> RGBColor[1, 0, 1]};

那么根据它们的标签,可以将这些点以对应的颜色绘制出来,如下所示。
ListPointPlot3D[Pick[points, labels, #] & /@ Union[labels], 
   PlotStyle -> Union[labels] /. rules]

plot

编辑

要在ListPlot3D中为单个点着色,可以使用VertexColors,例如:

ListPlot3D[points, VertexColors -> labels /. rules, Mesh -> False]

colouring points in a ListPlot3D


这对于单个点非常好,但我想象中的是用于演示多维数据的东西,就像右边的图片http://i44.tinypic.com/33bivzb.png 当使用Pick时,层会互相覆盖。无论如何,感谢您迅速的回答! - Tombart
@Tombart 我已经扩展了我的回答。 - Heike
非常好,非常感谢!只有一个小问题,提供的列表维度为{150,1},而我需要维度为{150,4}。我对Mathematica还很陌生,语法对我来说仍然是个谜。我将其改写为ListPlot3D[points, VertexColors -> {Map[({#, #, #, #}) &, labels] /. rules}, Mesh -> False],现在它完美地工作了 :) - Tombart

3
例如:
(* Build the labeled structure and take a random permutation*)
f[x_, y_] = Sqrt[100 - x x - y y];
l = RandomSample@Flatten[{Table[{{"Lower", {x, y, f[x, y] - 5}},
                                 {"Upper", {x, y, 5 - f[x, y]}}},
                          {x, -5, 5, .1}, {y, -5, 5, .1}]}, 3];
(*Plot*)

Graphics3D[
 Riffle[l[[All, 1]] /. {"Lower" -> Red, "Upper" -> Green}, 
  Point /@ l[[All, 2]]], Axes -> True]

enter image description here


这对于三维数据非常好,我还需要更多。我应该在问题中写清楚,不管怎样感谢回答,我以前不知道Riffle函数。 - Tombart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接