Personalizar visualizaciones con Matplotlib utilizando marcadores

Beginner

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

Introducción

Matplotlib es una popular biblioteca de Python utilizada para crear visualizaciones, incluyendo gráficos, diagramas y trazados. Uno de los componentes clave de Matplotlib son los marcadores, que se utilizan para representar puntos de datos en un trazado. Los marcadores vienen en diversas formas, tamaños y estilos, y se pueden personalizar para adaptarse a un conjunto de datos específico. En este laboratorio, aprenderá a utilizar los marcadores de Matplotlib para crear visualizaciones personalizadas que comuniquen efectivamente sus datos.

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 se puede automatizar 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.

Marcadores sin relleno

Los marcadores sin relleno son de un solo color. El siguiente código demuestra cómo crear marcadores sin relleno:

unfilled_markers = [m for m, func in Line2D.markers.items()
                    if func!= 'nothing' and m not in Line2D.filled_markers]

for ax, markers in zip(axs, split_list(unfilled_markers)):
    for y, marker in enumerate(markers):
        ax.text(-0.5, y, repr(marker), **text_style)
        ax.plot([y] * 3, marker=marker, **marker_style)
    format_axes(ax)

Marcadores con relleno

Los marcadores con relleno son lo contrario de los marcadores sin relleno. El siguiente código demuestra cómo crear marcadores con relleno:

fig, axs = plt.subplots(ncols=2)
fig.suptitle('Filled markers', fontsize=14)
for ax, markers in zip(axs, split_list(Line2D.filled_markers)):
    for y, marker in enumerate(markers):
        ax.text(-0.5, y, repr(marker), **text_style)
        ax.plot([y] * 3, marker=marker, **marker_style)
    format_axes(ax)

Estilos de relleno de marcadores

El color del borde y el color de relleno de los marcadores con relleno se pueden especificar por separado. Además, se puede configurar el fillstyle para que sea sin relleno, completamente relleno o relleno a la mitad en varias direcciones. Los estilos de relleno a la mitad utilizan markerfacecoloralt como color de relleno secundario. El siguiente código demuestra cómo crear estilos de relleno de marcadores:

fig, ax = plt.subplots()
fig.suptitle('Marker fillstyle', fontsize=14)
fig.subplots_adjust(left=0.4)

filled_marker_style = dict(marker='o', linestyle=':', markersize=15,
                           color='darkgrey',
                           markerfacecolor='tab:blue',
                           markerfacecoloralt='lightsteelblue',
                           markeredgecolor='brown')

for y, fill_style in enumerate(Line2D.fillStyles):
    ax.text(-0.5, y, repr(fill_style), **text_style)
    ax.plot([y] * 3, fillstyle=fill_style, **filled_marker_style)
format_axes(ax)

Marcadores creados a partir de símbolos de TeX

Utilice :ref:MathText <mathtext> para utilizar símbolos de marcador personalizados, como "$\u266B$". Para obtener una panorámica de los símbolos de la fuente STIX, consulte la tabla de fuentes STIX <http://www.stixfonts.org/allGlyphs.html>_. También consulte el :doc:/gallery/text_labels_and_annotations/stix_fonts_demo.

fig, ax = plt.subplots()
fig.suptitle('Mathtext markers', fontsize=14)
fig.subplots_adjust(left=0.4)

marker_style.update(markeredgecolor="none", markersize=15)
markers = ["$1$", r"$\frac{1}{2}$", "$f$", "$\u266B$", r"$\mathcal{A}$"]

for y, marker in enumerate(markers):
    ## Escape dollars so that the text is written "as is", not as mathtext.
    ax.text(-0.5, y, repr(marker).replace("$", r"\$"), **text_style)
    ax.plot([y] * 3, marker=marker, **marker_style)
format_axes(ax)

Marcadores creados a partir de trayectorias

Cualquier ~.path.Path se puede utilizar como marcador. El siguiente ejemplo muestra dos trayectorias simples, estrella y círculo, y una trayectoria más elaborada de un círculo con una estrella recortada.

import numpy as np

import matplotlib.path as mpath

star = mpath.Path.unit_regular_star(6)
circle = mpath.Path.unit_circle()
## concatenate the circle with an internal cutout of the star
cut_star = mpath.Path(
    vertices=np.concatenate([circle.vertices, star.vertices[::-1,...]]),
    codes=np.concatenate([circle.codes, star.codes]))

fig, ax = plt.subplots()
fig.suptitle('Path markers', fontsize=14)
fig.subplots_adjust(left=0.4)

markers = {'star': star, 'circle': circle, 'cut_star': cut_star}

for y, (name, marker) in enumerate(markers.items()):
    ax.text(-0.5, y, name, **text_style)
    ax.plot([y] * 3, marker=marker, **marker_style)
format_axes(ax)

Modificaciones avanzadas de marcadores con Transform

Los marcadores se pueden modificar pasando una transformada al constructor de MarkerStyle. El siguiente ejemplo muestra cómo se aplica una rotación suministrada a varias formas de marcadores.

common_style = {k: v for k, v in filled_marker_style.items() if k!= 'marker'}
angles = [0, 10, 20, 30, 45, 60, 90]

fig, ax = plt.subplots()
fig.suptitle('Rotated markers', fontsize=14)

ax.text(-0.5, 0, 'Filled marker', **text_style)
for x, theta in enumerate(angles):
    t = Affine2D().rotate_deg(theta)
    ax.plot(x, 0, marker=MarkerStyle('o', 'left', t), **common_style)

ax.text(-0.5, 1, 'Un-filled marker', **text_style)
for x, theta in enumerate(angles):
    t = Affine2D().rotate_deg(theta)
    ax.plot(x, 1, marker=MarkerStyle('1', 'left', t), **common_style)

ax.text(-0.5, 2, 'Equation marker', **text_style)
for x, theta in enumerate(angles):
    t = Affine2D().rotate_deg(theta)
    eq = r'$\frac{1}{x}$'
    ax.plot(x, 2, marker=MarkerStyle(eq, 'left', t), **common_style)

for x, theta in enumerate(angles):
    ax.text(x, 2.5, f"{theta}°", horizontalalignment="center")
format_axes(ax)

fig.tight_layout()

Establecimiento del estilo de tapón y el estilo de unión de los marcadores

Los marcadores tienen estilos de tapón y unión predeterminados, pero estos se pueden personalizar al crear un MarkerStyle.

from matplotlib.markers import CapStyle, JoinStyle

marker_inner = dict(markersize=35,
                    markerfacecolor='tab:blue',
                    markerfacecoloralt='lightsteelblue',
                    markeredgecolor='brown',
                    markeredgewidth=8,
                    )

marker_outer = dict(markersize=35,
                    markerfacecolor='tab:blue',
                    markerfacecoloralt='lightsteelblue',
                    markeredgecolor='white',
                    markeredgewidth=1,
                    )

fig, ax = plt.subplots()
fig.suptitle('Marker CapStyle', fontsize=14)
fig.subplots_adjust(left=0.1)

for y, cap_style in enumerate(CapStyle):
    ax.text(-0.5, y, cap_style.name, **text_style)
    for x, theta in enumerate(angles):
        t = Affine2D().rotate_deg(theta)
        m = MarkerStyle('1', transform=t, capstyle=cap_style)
        ax.plot(x, y, marker=m, **marker_inner)
        ax.plot(x, y, marker=m, **marker_outer)
        ax.text(x, len(CapStyle) -.5, f'{theta}°', ha='center')
format_axes(ax)

Modificando el estilo de unión

El estilo de unión de los marcadores también se puede modificar de manera similar.

fig, ax = plt.subplots()
fig.suptitle('Marker JoinStyle', fontsize=14)
fig.subplots_adjust(left=0.05)

for y, join_style in enumerate(JoinStyle):
    ax.text(-0.5, y, join_style.name, **text_style)
    for x, theta in enumerate(angles):
        t = Affine2D().rotate_deg(theta)
        m = MarkerStyle('*', transform=t, joinstyle=join_style)
        ax.plot(x, y, marker=m, **marker_inner)
        ax.text(x, len(JoinStyle) -.5, f'{theta}°', ha='center')
format_axes(ax)

plt.show()

Resumen

En este laboratorio, aprendiste cómo utilizar los marcadores de Matplotlib para crear visualizaciones personalizadas. En particular, aprendiste cómo crear marcadores sin relleno y con relleno, estilos de relleno de marcadores, marcadores creados a partir de símbolos de TeX, marcadores creados a partir de trayectorias, modificaciones avanzadas de marcadores con transformada y cómo establecer el estilo de tapón y el estilo de unión de los marcadores. Al utilizar estas técnicas, puedes crear visualizaciones efectivas que comuniquen tus datos con claridad y precisión.