Раскраска сюжета в Mathematica по меткам - PullRequest
5 голосов
/ 29 октября 2011

У меня есть набор данных с метками, которые я хотел бы построить с точками, окрашенными в соответствии с их метками. Есть ли простой способ, как получить текущий номер строки внутри графика, чтобы я мог определить, к какой категории относится точка?

Я понял, что 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]]
          ]
        ]
    ]

Ожидаемый результат:

expected result of visualization

Ответы [ 2 ]

5 голосов
/ 29 октября 2011

Предположим, что 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

3 голосов
/ 29 октября 2011

Например:

(* 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

...