2011-10-29 5 views
5

Tengo un conjunto de datos con etiquetas que me gustaría trazar con puntos coloreados de acuerdo con su etiqueta. ¿Hay una forma simple de obtener el número de línea actual dentro de la gráfica, para poder determinar a qué categoría pertenece el punto?Dibujo para colorear en Mathematica según las etiquetas

Entiendo que x,y,z son las coordenadas de los datos graficados, pero no ayuda con las etiquetas externas.

Esto es bastante feo y funciona solo en el conjunto de datos ordenados con distribución regular.

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

Resultado esperado:

expected result of visualization

+1

¿Dónde están las etiquetas en el conjunto de datos? Describa la estructura –

+0

las etiquetas son cadenas, podría reemplazarse por números o colores RGB, en realidad no importa – Tombart

+0

La pregunta aún no está del todo clara, un conjunto de datos de muestra sería bueno. ¿Necesitas trazar puntos separados o una superficie? ¿En qué formato están los datos? Sugerencia: ¿Puede separar sus puntos según la categoría y trazar cada categoría por sí mismo? 'GatherBy' podría ser útil. – Szabolcs

Respuesta

5

Supongamos que es points las listas de coordenadas y labels una lista de las etiquetas correspondientes por ejemplo

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

Cada etiqueta corresponde a un color que estoy escribiendo como una lista de reglas, p. ej.

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

A continuación, los puntos pueden representarse gráficamente en el color correspondiente a su etiqueta de la siguiente manera

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

plot

Editar

Para colorear puntos individuales en un ListPlot3D que pueda use VertexColors, por ejemplo

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

colouring points in a ListPlot3D

+0

Esto es genial para puntos individuales, lo que imaginé fue algo para la demostración de datos multidimensionales, como la imagen correcta http://i44.tinypic.com/33bivzb.png Al usar 'Pick' las capas se cubren entre sí. De todos modos, ¡gracias por una respuesta rápida! – Tombart

+0

@Tombart He extendido mi respuesta. – Heike

+0

Muy bien, muchas gracias!Hay un pequeño problema, que la lista de dimensiones tiene {150,1} y necesitaría dimensiones {150,4}. Soy bastante nuevo en Mathematica, por lo que la sintaxis sigue siendo un misterio para mí. Lo reescribí en 'ListPlot3D [points, VertexColors -> {Map [({#, #, #, #}) &, labels] /. rules}, Malla -> False] 'y funciona como un encanto :) – Tombart

3

Por ejemplo:

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

Esto es ideal para datos tridimensionales, voy a necesitar un poco más. Debería haberlo escrito en la pregunta, de todos modos, gracias por una respuesta, antes no conocía la función Riffle. – Tombart

Cuestiones relacionadas