Cómo hacerlo #

¿Por qué tengo tantos ticks y/o por qué están fuera de servicio? #

Una causa común del comportamiento inesperado de los ticks es pasar una lista de cadenas en lugar de números u objetos de fecha y hora . Esto puede suceder fácilmente sin previo aviso al leer un archivo de texto delimitado por comas. Matplotlib trata las listas de cadenas como variables categóricas ( trazado de variables categóricas ) y, de forma predeterminada, pone una marca por categoría y las traza en el orden en que se proporcionan.

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1, 2, constrained_layout=True, figsize=(6, 2))

ax[0].set_title('Ticks seem out of order / misplaced')
x = ['5', '20', '1', '9']  # strings
y = [5, 20, 1, 9]
ax[0].plot(x, y, 'd')
ax[0].tick_params(axis='x', labelcolor='red', labelsize=14)

ax[1].set_title('Many ticks')
x = [str(xx) for xx in np.arange(100)]  # strings
y = np.arange(100)
ax[1].plot(x, y)
ax[1].tick_params(axis='x', labelcolor='red', labelsize=14)

( Código fuente , png )

../../_images/howto_faq-1.png

La solución es convertir la lista de cadenas en números u objetos de fecha y hora (a menudo o ).np.asarray(numeric_strings, dtype='float')np.asarray(datetime_strings, dtype='datetime64[s]')

Para obtener más información, consulte Reparar demasiados ticks .

Determinar la extensión de los artistas en la figura #

A veces queremos saber el alcance de un Artista. Los objetos de Matplotlib Artisttienen un método Artist.get_window_extentque generalmente devolverá la extensión del artista en píxeles. Sin embargo, algunos artistas, en particular el texto, deben reproducirse al menos una vez antes de que se conozca su extensión. Suministros de Matplotlib Figure.draw_without_rendering, que deben llamarse antes de llamar get_window_extent.

Comprobar si una cifra está vacía #

Vacío en realidad puede significar cosas diferentes. ¿La figura contiene algún artista? ¿Cuenta como vacía una figura con un Axesalambique vacío? ¿La figura está vacía si se pintó en blanco puro (puede haber artistas presentes, pero podrían estar fuera del área de dibujo o transparentes)?

Para el propósito aquí, definimos vacío como: "La figura no contiene ningún artista, excepto su parche de fondo". La excepción para el fondo es necesaria, porque por defecto cada figura contiene un Rectangleparche como fondo. Esta definición se puede verificar a través de:

def is_empty(figure):
    """
    Return whether the figure contains no Artists (other than the default
    background patch).
    """
    contained_artists = figure.get_children()
    return len(contained_artists) <= 1

Hemos decidido no incluir esto como un método de figura porque esta es solo una forma de definir vacío, y rara vez es necesario verificar lo anterior. Por lo general, el usuario o el programa que maneja la figura saben si han agregado algo a la figura.

Verificar si una figura se quedaría vacía no se puede verificar de manera confiable, excepto renderizando la figura e investigando el resultado renderizado.

Encuentra todos los objetos en una figura de cierto tipo #

Cada artista de Matplotlib (consulte el tutorial de artistas ) tiene un método llamado findobj()que se puede usar para buscar recursivamente en el artista cualquier artista que pueda contener que cumpla con algunos criterios (por ejemplo, hacer coincidir todas las Line2D instancias o hacer coincidir alguna función de filtro arbitraria). Por ejemplo, el siguiente fragmento encuentra cada objeto en la figura que tiene una set_colorpropiedad y hace que el objeto sea azul:

def myfunc(x):
    return hasattr(x, 'set_color')

for o in fig.findobj(myfunc):
    o.set_color('blue')

También puede filtrar en instancias de clase:

import matplotlib.text as text
for o in fig.findobj(text.Text):
    o.set_fontstyle('italic')

Evite que las etiquetas de tick tengan un desplazamiento #

El formateador predeterminado utilizará un desplazamiento para reducir la longitud de las etiquetas. Para desactivar esta función por eje:

ax.get_xaxis().get_major_formatter().set_useOffset(False)

set rcParams["axes.formatter.useoffset"](predeterminado: True), o use un formateador diferente. Ver tickerpara más detalles.

Guardar figuras transparentes #

El savefig()comando tiene un argumento de palabra clave transparente que, si es 'Verdadero', hará que los fondos de la figura y los ejes sean transparentes al guardar, pero no afectará la imagen mostrada en la pantalla.

Si necesita un control más detallado, por ejemplo, no desea una transparencia total o también desea afectar la versión que se muestra en la pantalla, puede configurar las propiedades alfa directamente. La figura tiene una Rectangleinstancia llamada parche y los ejes tienen una instancia de Rectángulo llamada parche . Puede establecer cualquier propiedad en ellos directamente ( facecolor , edgecolor , linewidth , linestyle , alpha ). p.ej:

fig = plt.figure()
fig.patch.set_alpha(0.5)
ax = fig.add_subplot(111)
ax.patch.set_alpha(0.5)

Si necesita que todos los elementos de la figura sean transparentes, actualmente no hay una configuración alfa global, pero puede configurar el canal alfa en elementos individuales, por ejemplo:

ax.plot(x, y, alpha=0.5)
ax.set_xlabel('volts', alpha=0.5)

Guarde varias parcelas en un archivo pdf #

Muchos formatos de archivo de imagen solo pueden tener una imagen por archivo, pero algunos formatos admiten archivos de varias páginas. Actualmente, Matplotlib solo proporciona salida de varias páginas a archivos pdf, utilizando los backends pdf o pgf, a través de las clases backend_pdf.PdfPagesy .backend_pgf.PdfPages

Deje espacio para las etiquetas de verificación #

De forma predeterminada, Matplotlib utiliza márgenes porcentuales fijos alrededor de las subparcelas. Esto puede provocar que las etiquetas se superpongan o se corten en el límite de la figura. Hay varias formas de solucionar esto:

Alinear mis ylabels en varias subparcelas #

Si tiene varias subparcelas una encima de otra, y los datos y tienen escalas diferentes, a menudo puede obtener ylabels que no se alinean verticalmente en las múltiples subparcelas, lo que puede resultar poco atractivo. De forma predeterminada, Matplotlib coloca la ubicación x de la etiqueta y para que no se superponga con ninguna de las marcas y. Puede anular este comportamiento predeterminado especificando las coordenadas de la etiqueta. El siguiente ejemplo muestra el comportamiento predeterminado en las subparcelas de la izquierda y la configuración manual en las subparcelas de la derecha.

../../_images/sphx_glr_align_ylabels_001.png

Controla el orden de dibujo de los elementos de la trama #

El orden de dibujo de los elementos de la trama y, por lo tanto, qué elementos estarán en la parte superior, está determinado por la set_zorderpropiedad. Consulte la demostración de Zorder para obtener una descripción detallada.

Hacer que la relación de aspecto de las parcelas sea igual #

La propiedad Axes set_aspect()controla la relación de aspecto de los ejes. Puede configurarlo para que sea 'automático', 'igual' o alguna proporción que controle la proporción:

ax = fig.add_subplot(111, aspect='equal')

Consulte Relación de aspecto de eje igual para ver un ejemplo completo.

Dibuja múltiples escalas en el eje y #

Una solicitud frecuente es tener dos escalas para el eje Y izquierdo y derecho, que es posible usar twinx()(actualmente no se admiten más de dos escalas, aunque está en la lista de deseos). Esto funciona bastante bien, aunque hay algunas peculiaridades cuando intenta hacer una panorámica y hacer zoom de forma interactiva, porque ambas escalas no reciben las señales.

El enfoque usa twinx()(y su hermano twiny()) para usar 2 ejes diferentes , desactivando el marco rectangular de los ejes en el segundo eje para evitar que oscurezca el primero, y configurando manualmente las marcas y etiquetas como se desee. Puede usar matplotlib.tickerformateadores y localizadores separados si lo desea porque los dos ejes son independientes.

( Código fuente , png )

../../_images/howto_faq-2.png

Consulte Gráficos con diferentes escalas para ver un ejemplo completo.

Genera imágenes sin que aparezca una ventana #

Simplemente no llame showy guarde directamente la figura en el formato deseado:

import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.savefig('myfig.png')

Ver también

Incrustación en un servidor de aplicaciones web (Flask) para obtener información sobre cómo ejecutar matplotlib dentro de una aplicación web.

Trabajar con hilos #

Matplotlib no es seguro para subprocesos: de hecho, existen condiciones de carrera conocidas que afectan a ciertos artistas. Por lo tanto, si trabaja con subprocesos, es su responsabilidad configurar los bloqueos adecuados para serializar el acceso a los artistas de Matplotlib.

Es posible que pueda trabajar en figuras separadas de subprocesos separados. Sin embargo, en ese caso debe usar un backend no interactivo (generalmente Agg), porque la mayoría de los backends de GUI también requieren que se ejecuten desde el subproceso principal.