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.