Establecer marcadores para puntos individuales en una línea en Matplotlib

174

He usado 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?

Para aclarar mi pregunta, quiero poder establecer el estilo para marcadores individuales en una línea, no todos los marcadores en dicha línea.

dbmikus
fuente
2
Solución relacionada para el espaciado del marcador de longitud de arco: stackoverflow.com/questions/17406758/…
Ioannis Filippidis

Respuestas:

324

Especifique la palabra clave args linestyley / o markeren su llamada a plot.

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

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

Una llamada de acceso directo para lo mismo:

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

Ejemplo 1

Aquí hay una lista de los posibles 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
================    ===============================

editar: con un ejemplo de marcado de un subconjunto arbitrario de puntos, como se solicita en los comentarios:

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

ejemplo2

Este último ejemplo usando el markeverykwarg es posible desde 1.4+, debido a la fusión de esta rama de características . Si está atascado en una versión anterior de matplotlib, aún puede lograr el resultado superponiendo un diagrama de dispersión en el diagrama lineal. Vea el historial de edición para más detalles.

wim
fuente
2
Conozco esa parte Lo que quiero hacer es marcar solo ciertos puntos. Dado su ejemplo, ¿cómo pondría un marcador solo en los puntos 2 y 3, por ejemplo? Lo siento si mi pregunta no fue lo suficientemente clara en este aspecto.
dbmikus
44
Podría llamar a plot una vez con el estilo '-', y luego podría llamar a plot nuevamente, en un subconjunto de puntos, con el estilo 'o'.
wim
¿Podría simplemente iterar sobre los valores que proporcioné para trazar y simplemente hacer una subtrama de puntos desconectada con marcadores? ¿Y luego se colocarían en la parte superior de la línea anterior? ¿O hay una forma más limpia de hacerlo? Estoy bien haciéndolo de esa manera, pero me gustaría codificarlo de la manera más aceptable.
dbmikus
1
No, no use un bucle, habrá demasiados artistas en el lienzo que pueden ser muy lentos. Use una porción de la entrada original.
wim
@AbidRahmanK También puede ver todos los marcadores disponibles a través de matplotlib.markers.MarkerStyle.markers, que devuelve un diccionario similar al que wim publicó anteriormente.
joelostblom
54

Hay una imagen que muestra el nombre y la descripción de todos los marcadores, espero que te sirva de ayuda.

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

Ejemplo 1

Wubin Ding
fuente
14

Para referencia futura: el Line2Dartista devuelto por plot()también tiene un set_markevery()método que le permite establecer solo marcadores en ciertos puntos; consulte https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D. set_markevery

perdió
fuente
2
Es cierto, pero no en puntos arbitrarios - tiene que ser empezar: Parada: paso especie de subconjuntos Creo ..
wim
Mi impresión es que las dos publicaciones anteriores responden la pregunta. La razón es que abordan dos cuestiones 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 destacar 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, después de publicar el código relevante.
Ioannis Filippidis
1
@wim Hay un RP que esperamos que llegue a 1.4 que le permitirá marcar puntos arbitrarios github.com/matplotlib/matplotlib/pull/2662
tacaswell
1

Un truco simple para cambiar la forma, el tamaño de un marcador de punto en particular ... es trazarlo primero con todos los demás datos y luego trazar uno más solo con ese punto (o un conjunto de puntos si desea cambiar el estilo de varios puntos) . Supongamos que queremos cambiar la forma del marcador del segundo punto:

x = [1,2,3,4,5]
y = [2,1,3,6,7]

plt.plot(x, y, "-o")
x0 = [2]
y0 = [1]
plt.plot(x0, y0, "s")

plt.show()

El resultado es: Gráfico con múltiples marcadores

Pankaj Joshi
fuente