2011-12-31 16 views
10

puedo conseguir un color ListLinePlot haciendo algo comopunto individual colorante en ListPlot, ErrorListPlot en Mathematica

ListLinePlot[Range[420, 680, 20], ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False] 

Mathematica graphics

Sin embargo, como se indica en el archivo de ayuda (" ColorFunction requiere al menos un conjunto de datos ser Joined "), si hago el equivalente

ListPlot[Range[420, 680, 20], ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False] 

Mathematica graphics

todos mis puntos son azules. ¿Hay alguna manera de hacer que ColorFunction funcione en ListPlot con Joined -> False?

Es decir, hay una manera más agradable para conseguir algo como

ListPlot[ 
List /@ Transpose[{Range[(680 - 420)/20 + 1], Range[420, 680, 20]}], 
PlotMarkers -> ({Graphics[{#, Disk[]}], 0.05} & /@ ColorData["VisibleSpectrum"] /@ Range[420, 680, 20]) 
] 

?

Mathematica graphics

(Además, ¿alguien tiene una explicación de por qué Mathematica requiere Joined -> True con el fin de hacer uso de ColorFunction?)

Editar: Yo también estoy buscando una manera de hacer una coloración similar con ErrorListPlot en el paquete ErrorBarPlots.

Respuesta

7

El problema es que Join-> True dibuja una línea [] a la que se le puede dar VertexColors por cada punto que lo contenga. Supongo que hacer lo mismo con los puntos cuando configurar Unidos> False conduce a situaciones en las que no funciona. Sin embargo, Line [] y Point [] funcionan más o menos igual en su caso.Entonces, ¿se trata de

ListLinePlot[Range[420, 680, 20], ColorFunction -> "VisibleSpectrum", 
    ColorFunctionScaling -> False] /. Line[arg___] :> Point[arg] 

Mathematica graphics

Y, por cierto, si el uso de solamente un ListLinePlot, donde las únicas directivas de línea [] que surgen son el de sus datos, esto debería funcionar incluso si tener más conjuntos de datos y {x, y} coordina

data = Transpose[Table[{{x, Sin[x]}, {x, Cos[x]}}, {x, 0, 2 Pi, 0.2}]]; 
ListLinePlot[data, ColorFunction -> Hue] /. Line[arg___] :> Point[arg] 

Mathematica graphics

+0

¿Existe una solución igualmente agradable para 'ErrorListPlot' en el paquete' ErrorBarPlots'? –

+0

Y puede agregar algo como 'PlotStyle -> AbsolutePointSize [5]' en el código, es decir, el código que dibuja las líneas, para controlar el tamaño del punto final. –

+0

@Jason, un 'ErrorListPlot' no se puede colorear con un truco breve como el anterior por al menos dos razones: los objetos que deberían tener el mismo color se dividen en varias directivas de gráficos. Tendría que encontrar las líneas y puntos correspondientes. La segunda razón es que ese * un * punto tiene * una * posición que se usa para el color. Un 'ErrorBar' tiene varias posiciones diferentes. Por lo tanto, no está claro cuál te gusta usar para el color. Compruebe el 'InputForm' de su' ErrorListPlot'. – halirutan

3

Puede utilizar DiscretePlot:

data = Range[420, 680, 20]; 
DiscretePlot[data[[i]], {i, Length[data]}, 
    ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False, 
    Filling -> None] 

Mathematica graphics

Si está trazando una lista de puntos xey, se pone un poco más complicado:

data = Transpose[{Range[420, 680, 20], Range[400, 530, 10]}]; 
mapping = Apply[Rule, data, 2]; 
DiscretePlot[i/.mapping, {i, data[[;;,1]]}, 
    ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False, 
    Filling -> None] 

Mathematica graphics

Parece bastante extraño que DiscretePlot le permitirá colorear los puntos de manera diferente, mientras que ListPlot no lo hará. Estoy seguro de que debe tener algo que ver con los detalles de la implementación, pero no puedo pensar en una razón por la cual ese sería el caso.

1

me encontré con este problema en mi trabajo también. I asignar un color a cada punto de la siguiente manera:

data = ... 
ListPlot[data] /. Point[args___] :> Point[args, VertexColors -> {c1, c2, ...}] 

donde c1 es el color para el primer punto de datos, y así sucesivamente. La lista de color puede ser mediante programación genera, por ejemplo

ColorData["Rainbow"] /@ ([email protected]@data/[email protected]) 

Here is the result.

Los puntos positivos de este método son como sigue.

  • Es sencillo: tenemos una lista de pares, luego creamos una lista de colores correspondiente.
  • Nuestro código original ListPlot no necesita ser modificado (por ejemplo, cambiado a ListLinePlot).