2011-10-29 12 views
5

Mam zestaw danych z etykietami, które chciałbym drukować z punktami w kolorze zgodnie z ich etykietą. Czy istnieje prosty sposób, aby uzyskać bieżący numer linii wewnątrz wykresu, aby móc określić, do której kategorii należy ten punkt?Kolorowanie wykresu w Mathematica według etykiet

Zrozumiałem, że x,y,z są współrzędnymi wykreślonych danych, ale nie pomaga to dla etykiet zewnętrznych.

To jest dość brzydkie i działa tylko na posortowany zbiór danych z regularną dystrybucją.

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

Oczekiwany wynik:

expected result of visualization

+1

Gdzie są etykiety w swoim zbiorze? Proszę opisać struktury –

+0

etykiety są łańcuchami, można je zastąpić liczbami lub kolorami RGB, tak naprawdę nie ma znaczenia – Tombart

+0

Pytanie wciąż nie jest całkiem jasne, przykładowy zestaw danych byłby dobry. Czy potrzebujesz wykreślić oddzielne punkty lub powierzchnię? W jakim formacie są dane? Sugestia: czy możesz oddzielić swoje punkty według kategorii i narysować każdą kategorię na własną rękę? "GatherBy" może się przydać. – Szabolcs

Odpowiedz

5

Załóżmy, że points jest wykazy współrzędnych i labels listę odpowiednie etykiety, na przykład:

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]]; 

Każda etykieta odpowiada kolorowi, który piszę jako lista reguł, np.

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

Następnie punkty mogą być przedstawione w kolorze odpowiadającym ich etykiety następująco

ListPointPlot3D[Pick[points, labels, #] & /@ Union[labels], 
    PlotStyle -> Union[labels] /. rules] 

plot

Edit

Aby pokolorować poszczególne punkty w ListPlot3D możesz użyj VertexColors, na przykład

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

colouring points in a ListPlot3D

+0

To jest świetne dla pojedynczych punktów, które, jak sobie wyobrażałem, służyły do ​​prezentacji wielowymiarowych danych, takich jak odpowiedni obraz http://i44.tinypic.com/33bivzb.png Podczas korzystania z opcji "Pick" warstwy pokrywają się nawzajem. W każdym razie dziękuję za szybką odpowiedź! – Tombart

+0

@Tombart Rozszerzyłem moją odpowiedź. – Heike

+0

Bardzo ładne, wielkie dzięki!Jest tylko mały problem, że dostarczona lista ma wymiary {150,1} i potrzebowałabym wymiarów {150,4}. Jestem całkiem nowy w Mathematica, więc składnia wciąż pozostaje dla mnie tajemnicą. Przepisałem go na ListPlot3D [points, VertexColors -> {Map [({#, #, #, #}) &, labels] /. rules}, Mesh -> False] 'i działa jak urok :) – Tombart

3

Dla przykładu:

(* Build the labeled structure and take a random permutation*) 
f[x_, y_] = Sqrt[100 - x x - y y]; 
l = [email protected][{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

+0

To jest świetne dla danych trójwymiarowych, będę potrzebować trochę więcej. Powinienem był napisać to w pytaniu, w każdym razie dzięki za odpowiedź, nie znałem wcześniej funkcji Riffla. – Tombart

Powiązane problemy