2011-10-29 10 views
5

Ho un set di dati con etichette che vorrei tracciare con punti colorati in base alla loro etichetta. C'è un modo semplice per ottenere numeri di riga correnti all'interno della trama, in modo da poter determinare a quale categoria appartiene il punto?Trama da colorare in Mathematica secondo le etichette

Ho capito che x,y,z sono le coordinate dei dati tracciati, ma non è di aiuto per le etichette esterne.

Questo è piuttosto brutto e funziona solo sul set di dati ordinato con distribuzione regolare.

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

Risultato atteso:

expected result of visualization

+1

Dove sono le etichette di un set di dati? Si prega di descrivere la struttura –

+0

le etichette sono stringhe, potrebbe essere sostituito da numeri o colori RGB, non importa davvero – Tombart

+0

La domanda non è ancora del tutto chiara, un set di dati campione sarebbe buono. Hai bisogno di tracciare punti separati o una superficie? In che formato sono i dati? Suggerimento: puoi separare i tuoi punti in base alla categoria e tracciare ciascuna categoria da sola? 'GatherBy' potrebbe essere utile. – Szabolcs

risposta

5

Supponiamo che points è gli elenchi di coordinate e labels un elenco dei etichette corrispondenti, ad esempio

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

Ogni etichetta corrisponde a un colore che sto scrivendo come un elenco di regole, ad es.

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

Poi i punti possono essere rappresentate graficamente nel colore corrispondente alla loro etichetta come segue

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

plot

Modifica

Per colorare i singoli punti in un ListPlot3D si può utilizzare VertexColors, ad esempio

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

colouring points in a ListPlot3D

+0

Questo è ottimo per i singoli punti, quello che ho immaginato era qualcosa per la dimostrazione di dati multidimensionali, come l'immagine giusta http://i44.tinypic.com/33bivzb.png Quando si usa 'Pick' gli strati si coprono l'un l'altro. Comunque grazie per una rapida risposta! – Tombart

+0

@ Tomart Ho esteso la mia risposta. – Heike

+0

Molto bello, grazie mille!C'è solo un piccolo problema, che l'elenco fornito di ha dimensioni {150,1} e avrei bisogno di dimensioni {150,4}. Sono abbastanza nuovo per Mathematica, quindi la sintassi è ancora un mistero per me. L'ho riscritto su 'ListPlot3D [punti, VertexColors -> {Mappa [({#, #, #}) &, etichette] /. rules}, Mesh -> False] 'e funziona come un fascino :) – Tombart

3

Per esempio:

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

Questo è ottimo per i dati tridimensionali, ne avrò bisogno di altro. Avrei dovuto scriverlo nella domanda, comunque grazie per una risposta, prima non conoscevo la funzione Riffle. – Tombart

Problemi correlati