2012-02-14 24 views
9

Estoy graficando algunos datos (dos líneas) y me gustaría cambiar el estilo de línea para las partes de las líneas donde la diferencia entre ellas es estadísticamente significativa. Entonces, en la imagen de abajo (ahora un enlace b/c las políticas antispam no me permiten publicar una imagen) me gustaría que las líneas se vean diferentes (es decir, discontinuas quizás) hasta que comiencen a converger a aproximadamente 35 en el eje xCambiar el estilo de línea matplotlib gráfico medio

line plot

¿Hay una manera de hacer esto fácilmente? Tengo los valores para el eje x donde las diferencias son significativas, no tengo claro cómo cambiar los estilos de línea en ciertas ubicaciones del eje x.

+3

Qué sobre la fabricación de dos parcelas por cada curva? Uno con el primer conjunto de puntos (antes de que los valores comiencen a converger) y luego otro con el segundo conjunto. Simplemente configure las parcelas para que tengan el mismo estilo (color, marcador, etc.), ¡excepto el estilo de línea! :) –

+0

Gracias, intentaré esto. Tengo algunas otras parcelas donde las líneas divergen de nuevo más adelante en el ciclo de entrar y salir de importancia. Esto significará que tendré muchos comandos de trama, pero espero poder resolverlos. – Sceeerutinizer

+0

@ RicardoCardenes- Le sugiero que ponga su comentario como respuesta para que pueda ser votado/aceptado. Es la forma correcta de hacerlo :-) –

Respuesta

14

Editar: que había tenido esta abierta y la izquierda, por lo que no se dio cuenta @ La respuesta de Ricardo Debido a que matplotlib convertirá las cosas en matrices numpy independientemente, hay formas más eficientes de hacerlo.

Como un ejemplo:

Sólo trazar dos líneas diferentes, uno con un estilo de línea de trazos y otro con un estilo de línea sólida.

E.g.

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 10, 100) 
y1 = 2 * x 
y2 = 3 * x 

xthresh = 4.5 
diff = np.abs(y1 - y2) 
below = diff < xthresh 
above = diff >= xthresh 

# Plot lines below threshold as dotted... 
plt.plot(x[below], y1[below], 'b--') 
plt.plot(x[below], y2[below], 'g--') 

# Plot lines above threshold as solid... 
plt.plot(x[above], y1[above], 'b-') 
plt.plot(x[above], y2[above], 'g-') 

plt.show() 

enter image description here

Para el caso en que son cíclicos, utilizan matrices enmascarados:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 10, 100) 
y1 = 2 * np.cos(x) 
y2 = 3 * np.sin(x) 

xthresh = 2.0 
diff = np.abs(y1 - y2) 
below = diff < xthresh 
above = diff >= xthresh 

# Plot lines below threshold as dotted... 
plt.plot(np.ma.masked_where(below, x), np.ma.masked_where(below, y1), 'b--') 
plt.plot(np.ma.masked_where(below, x), np.ma.masked_where(below, y2), 'g--') 

# Plot lines above threshold as solid... 
plt.plot(np.ma.masked_where(above, x), np.ma.masked_where(above, y1), 'b-') 
plt.plot(np.ma.masked_where(above, x), np.ma.masked_where(above, y2), 'g-') 

plt.show() 

enter image description here

+0

pensando en algo así, pero de alguna manera decidió hacerlo de una manera compleja: D. Muy bien :) –

+0

Me alegro de haber refrescado esto. Estaba considerando usar una matriz enmascarada. Muy útil. Gracias a todos por la visión. – Sceeerutinizer

+0

http://stackoverflow.com/questions/27082282/changing-line-style-for-certain-range-of-values-using-matplotlib – Ohm

3

Digamos que sus datos están en matrices NumPy dataset1 y dataset2 y que ha definido como su importancia threshold

def group(data): 
    """Assumes that len(data) > 0""" 
    prev = 0 
    index = 1 
    value = data[0] 

    while (index < len(data)): 
     if data[index] != value: 
      yield (value, prev, index) 

      value = not value 
      prev = index 
     index += 1 

    yield (value, prev, index) 

diff = np.abs(dataset1 - dataset2) 
for significant, start, end in group(diff < threshold): 
    # Plot data from dataset1[start:end] and dataset2[start:end] 
    # Use the value in "significant" (True/False) to figure out 
    # The style 
+0

Creo que podría hacerlo más corto utilizando algo de 'itertools', pero supongo que esto es suficiente: P –

Cuestiones relacionadas