Establecer marcadores para puntos individuales en una línea

4 minutos de lectura

avatar de usuario de dbmikus
dbmikus

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 para todos los marcadores en dicha línea.

avatar de usuario de wim
ingenio

Especifique los argumentos de la palabra clave linestyle y/o marker en tu llamada a plot.

Por ejemplo, usando una línea discontinua y marcadores circulares azules:

plt.plot(range(10), linestyle="--", marker="o", color="b", label="line with marker")
plt.legend()

Una llamada de atajo para lo mismo:

plt.plot(range(10), '--bo', label="line with marker")
plt.legend()

ingrese la descripción de la imagen aquí

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 marcar 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, label="line with select markers")
plt.legend()
plt.show()

ingrese la descripción de la imagen aquí

Este último ejemplo usando el markevery kwarg es posible desde 1.4+, debido a la fusión de esta rama característica. 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 de líneas. Consulte el historial de edición para obtener más detalles.

Avatar de usuario de Odín
Odín

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

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(figsize=(8, 8))

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.axis('off')
plt.tight_layout()
plt.show() 

ingrese la descripción de la imagen aquí

avatar de usuario de lost
perdido

Para futuras referencias – el Line2D artista devuelto por plot() también tiene un set_markevery() método que le permite establecer sólo marcadores en ciertos puntos – ver https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D.set_markevery

Avatar de usuario de Pankaj Joshi
Pankaj Joshi

Un truco simple para cambiar la forma y el tamaño de un marcador de punto en particular… es trazarlo primero con todos los demás datos y luego trazar un gráfico más solo con ese punto (o un conjunto de puntos si desea cambiar el estilo de múltiples 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:
Trazar con múltiples marcadores

ingrese la descripción de la imagen aquí

Avatar de usuario de Ricardo Roa
ricardo roa

hola hay un ejemplo:

import numpy as np
import matplotlib.pyplot as plt

def grafica_seno_coseno():
    x = np.arange(-4,2*np.pi, 0.3)
    y = 2*np.sin(x)
    y2 = 3*np.cos(x)
    plt.plot(x, y,  '-gD')
    plt.plot(x, y2, '-rD')
    for xitem,yitem in np.nditer([x,y]):
        etiqueta = "{:.1f}".format(xitem)
        plt.annotate(etiqueta, (xitem,yitem), textcoords="offset points",xytext=(0,10),ha="center")
    for xitem,y2item in np.nditer([x,y2]):
        etiqueta2 = "{:.1f}".format(xitem)
        plt.annotate(etiqueta2, (xitem,y2item), textcoords="offset points",xytext=(0,10),ha="center")
    plt.grid(True)
    plt.show()
    
    
grafica_seno_coseno()

ingrese la descripción de la imagen aquí

¿Ha sido útil esta solución?