Раскраска графика в Mathematica в соответствии с метками

#wolfram-mathematica #plot

#wolfram-mathematica #график

Вопрос:

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

Я понял, что 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. Где находятся метки в вашем наборе данных? Пожалуйста, опишите структуру

2. метки — это строки, их можно заменить числами или цветами RGB, на самом деле это не имеет значения

3. Вопрос все еще не совсем ясен, образец набора данных был бы хорош. Вам нужно нанести отдельные точки или поверхность? В каком формате находятся данные? Предложение: можете ли вы разделить свои точки по категориям и отобразить каждую категорию отдельно? GatherBy может быть полезно.

4. Я отредактировал вопрос, надеюсь, он более понятен. В этом случае я предпочитаю поверхность, потому что она кажется более понятной. Есть 4 параметра, которые усложняют задачу. Выбор только 3 из них — еще один вариант для визуализации

5. Список … 3D [{ }] будет принимать тройки в качестве входных данных. У вас есть четырехмерные векторы в inData

Ответ №1:

Предположим, что 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, #] amp; /@ Union[labels], 
   PlotStyle -> Union[labels] /. rules]
 

график

Редактировать

Чтобы раскрасить отдельные точки в a ListPlot3D , вы можете использовать VertexColors , например

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

раскрашивание точек в ListPlot3D

Комментарии:

1. Это отлично подходит для отдельных точек, я представлял себе что-то для демонстрации многомерных данных, например, правильное изображение i44.tinypic.com/33bivzb.png При использовании Pick слои перекрывают друг друга. В любом случае спасибо за быстрый ответ!

2. @Tombart я расширил свой ответ.

3. Очень приятно, большое спасибо! Есть только небольшая проблема, заключающаяся в том, что предоставленный список имеет размеры {150,1}, и мне понадобятся размеры {150,4}. Я совсем новичок в Mathematica, поэтому синтаксис для меня все еще остается загадкой. Я переписал его ListPlot3D[points, VertexColors -> {Map[({#, #, #, #}) amp;, labels] /. rules}, Mesh -> False] , и он работает как шарм 🙂

Ответ №2:

Например:

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

введите описание изображения здесь

Комментарии:

1. Это отлично подходит для трехмерных данных, мне понадобится еще немного. Я должен был написать это в вопросе, в любом случае, спасибо за ответ, раньше я не знал функции Riffle.