2011-12-07 21 views
98

He utilizado matplotlib para trazar líneas en una figura. Ahora me gustaría establecer el estilo, específicamente el marcador, para puntos individuales en la línea. ¿Cómo hago esto?matplotlib: Establecer marcadores para puntos individuales en una línea

Editar: para aclarar mi pregunta, que fue respondida, quiero ser capaz de establecer el estilo de los marcadores individuales en una línea, no todos los marcadores en dicha línea.

+2

solución relacionado para longitud de arco marcador espaciamiento: http://stackoverflow.com/questions/17406758/plotting-a-curve-with-equidistant-arc-length-markers –

Respuesta

178

Especifique la palabra clave args linestyle y/o en su llamada al plot.

Por ejemplo, usando una línea de trazos y los marcadores de círculo azul:

plt.plot(range(10), linestyle='--', marker='o', color='b') 

Una llamada de método abreviado para lo mismo:

plt.plot(range(10), '--bo') 

example1

Aquí es una lista de la posible estilos de línea y marcador:

================ =============================== 
character   description 
================ =============================== 
    -    solid line style 
    --    dashed line style 
    -.    dash-dot line style 
    :    dotted line style 
    .    point marker 
    ,    pixel marker 
    o    circle marker 
    v    triangle_down marker 
^    triangle_up marker 
    <    triangle_left marker 
    >    triangle_right marker 
    1    tri_down marker 
    2    tri_up marker 
    3    tri_left marker 
    4    tri_right marker 
    s    square marker 
    p    pentagon marker 
    *    star marker 
    h    hexagon1 marker 
    H    hexagon2 marker 
    +    plus marker 
    x    x marker 
    D    diamond marker 
    d    thin_diamond marker 
    |    vline marker 
    _    hline marker 
================ =============================== 

edit: con un ejemplo de marcar un subconjunto arbitrario de puntos, como se pide en las observaciones:

import numpy as np 
import matplotlib.pyplot as plt 

xs = np.linspace(-np.pi, np.pi, 30) 
ys = np.sin(xs) 
markers_on = [12, 17, 18, 19] 
plt.plot(xs, ys, '-gD', markevery=markers_on) 
plt.show() 

example2

Este último ejemplo usando el kwarg markevery es posible en desde 1.4+, debido a la fusión de this feature branch. Si está atascado en una versión anterior de matplotlib, aún puede lograr el resultado al superponer un diagrama de dispersión en el diagrama de líneas. Vea el edit history para más detalles.

+2

que sé esa parte. Lo que quiero hacer es marcar solo ciertos puntos. Dado su ejemplo, ¿cómo pondría un marcador solo en el 2 ° y 3 ° puntos, por ejemplo? Disculpa si mi pregunta no fue lo suficientemente clara en este aspecto. – dbmikus

+4

Puede llamar a la trama una vez con el estilo '-', y luego puede llamar a la trama nuevamente, en un subconjunto de los puntos, con el estilo 'o'. – wim

+0

¿Podría simplemente iterar sobre los valores que proporcioné para trazar y simplemente hacer una subparcela de punto desconectada con marcadores? ¿Y luego se colocarían en la parte superior de la línea anterior? ¿O hay una manera más limpia de hacerlo? Estoy bien hacerlo de esa manera, pero me gustaría codificarlo de la manera más aceptable. – dbmikus

11

Para referencia futura - el artista Line2D devuelto por plot() también tiene un método set_markevery() que le permite configurar solamente marcadores en determinados puntos - ver https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D.set_markevery

+2

Cierto, pero no en puntos arbitrarios: tiene que ser start: stop: clase de subconjuntos paso a paso, creo ... – wim

+0

Mi impresión es que las dos publicaciones anteriores responden la pregunta. La razón es que abordan dos problemas diferentes. El término "marcadores" generalmente se refiere al estilo de una curva. Entonces, una regla regular (por ejemplo, cada 10) está implícita. Si desea seleccionar un subconjunto de puntos "arbitrario", considérelo como una curva separada, no como marcadores en la curva original. Es solo una curva diferente que tiene marcadores. Por lo tanto, se espera que tenga que seleccionar manualmente los puntos. Este tema es interesante y profundiza, comentará más en una publicación futura, luego de publicar el código relevante. –

+1

@wim Hay un PR que con suerte lo convertirá en 1.4 que le permitirá marcar puntos arbitrarios https://github.com/matplotlib/matplotlib/pull/2662 – tacaswell

9

No es una demostración de la imagen nombre y la descripción todos los marcadores, espero Esto te ayudará.

import matplotlib.pylab as plt 
markers=['.',',','o','v','^','<','>','1','2','3','4','8','s','p','P','*','h','H','+','x','X','D','d','|','_'] 
descriptions=['point', 'pixel', 'circle', 'triangle_down', 'triangle_up','triangle_left', 'triangle_right', 'tri_down', 'tri_up', 'tri_left','tri_right', 'octagon', 'square', 'pentagon', 'plus (filled)','star', 'hexagon1', 'hexagon2', 'plus', 'x', 'x (filled)','diamond', 'thin_diamond', 'vline', 'hline'] 
x=[] 
y=[] 
for i in range(5): 
    for j in range(5): 
     x.append(i) 
     y.append(j) 
plt.figure() 
for i,j,m,l in zip(x,y,markers,descriptions): 
    plt.scatter(i,j,marker=m) 
    plt.text(i-0.15,j+0.15,s=m+' : '+l) 
plt.axis([-0.1,4.8,-0.1,4.5]) 
plt.tight_layout() 
plt.axis('off') 
plt.show() 

example1 Click here to see picture

Cuestiones relacionadas