Tutorial de personalización de marcadores en Matplotlib

PythonPythonBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Este tutorial lo guiará a través del proceso de uso de la propiedad markevery de Line2D para dibujar marcadores en un subconjunto de puntos de datos en Matplotlib. Cubriremos varias maneras de especificar los marcadores, incluyendo el uso de enteros, tuplas, listas, rebanadas y flotantes. También exploraremos cómo se comporta markevery con escalas lineales y logarítmicas, así como con gráficos polar y con zoom.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de operaciones no puede automatizarse debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Definir los puntos de datos

Primero, definimos los puntos de datos que usaremos para nuestros gráficos. En este ejemplo, usamos numpy para generar un conjunto de valores de x e y para una onda senoidal.

import matplotlib.pyplot as plt
import numpy as np

## define a list of markevery cases to plot
cases = [
    None,
    8,
    (30, 8),
    [16, 24, 32],
    [0, -1],
    slice(100, 200, 3),
    0.1,
    0.4,
    (0.2, 0.4)
]

## data points
delta = 0.11
x = np.linspace(0, 10 - 2 * delta, 200) + delta
y = np.sin(x) + 1.0 + delta

Crear gráficos con escalas lineales

A continuación, creamos un conjunto de subgráficos para mostrar cómo se comporta markevery con escalas lineales. Iteramos a través de la lista cases y graficamos cada caso en un subgráfico separado. Usamos el parámetro markevery para especificar qué puntos de datos marcar.

## create plots with linear scales
fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)

Crear gráficos con escalas logarítmicas

Repetimos el paso anterior, pero esta vez con escalas logarítmicas. Notamos que la escala logarítmica causa una asimetría visual en la distancia de los marcadores para la submuestreación basada en enteros, mientras que la submuestreación basada en fracciones crea distribuciones uniformes.

## create plots with logarithmic scales
fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.set_xscale('log')
    ax.set_yscale('log')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)

Crear gráficos con zoom

Creamos otro conjunto de subgráficos, esta vez para mostrar cómo se comporta markevery en gráficos con zoom. Notamos que la submuestreación basada en enteros selecciona puntos de los datos subyacentes y es independiente de la vista, mientras que la submuestreación basada en flotantes está relacionada con la diagonal de los ejes y cambia el rango de datos mostrado.

## create zoomed plots
fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)
    ax.set_xlim((6, 6.7))
    ax.set_ylim((1.1, 1.7))

Crear gráficos polares

Finalmente, creamos un conjunto de subgráficos para mostrar cómo se comporta markevery en gráficos polares. Notamos que el comportamiento es similar al de las escalas lineales.

## create polar plots
r = np.linspace(0, 3.0, 200)
theta = 2 * np.pi * r

fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained',
                        subplot_kw={'projection': 'polar'})
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(theta, r, 'o', ls='-', ms=4, markevery=markevery)

Resumen

En este tutorial, aprendimos cómo usar la propiedad markevery de Line2D para dibujar marcadores en un subconjunto de puntos de datos en Matplotlib. Exploramos varias maneras de especificar los marcadores, incluyendo el uso de enteros, tuplas, listas, rebanadas y flotantes. También vimos cómo se comporta markevery con escalas lineales y logarítmicas, así como con gráficos con zoom y polares.