¿Cómo le digo a Matplotlib que cree una segunda trama (nueva) y luego trace en la anterior?

5 minutos de lectura

avatar de usuario
Pedro D.

Quiero trazar datos, luego crear una nueva figura y trazar datos2, y finalmente volver a la trama original y trazar datos3, algo así:

import numpy as np
import matplotlib as plt

x = arange(5)
y = np.exp(5)
plt.figure()
plt.plot(x, y)

z = np.sin(x)
plt.figure()
plt.plot(x, z)

w = np.cos(x)
plt.figure("""first figure""") # Here's the part I need
plt.plot(x, w)

FYI ¿Cómo le digo a matplotlib que he terminado con una trama? hace algo similar, pero no del todo! No me deja acceder a esa trama original.

avatar de usuario
simonb

Si se encuentra haciendo cosas como esta regularmente, puede valer la pena investigar la interfaz orientada a objetos de matplotlib. En tu caso:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.exp(x)
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("Axis 1 title")
ax1.set_xlabel("X-label for axis 1")

z = np.sin(x)
fig2, (ax2, ax3) = plt.subplots(nrows=2, ncols=1) # two axes on figure
ax2.plot(x, z)
ax3.plot(x, -z)

w = np.cos(x)
ax1.plot(x, w) # can continue plotting on the first axis

Es un poco más detallado pero es mucho más claro y fácil de seguir, especialmente con varias figuras, cada una con múltiples subtramas.

  • Prefiero el enfoque orientado a objetos, ya que cuando anticipo tener muchas figuras, será más fácil hacer un seguimiento de ellas usando nombres en lugar de números. ¡Gracias!

    – Pedro D.

    4 de agosto de 2011 a las 4:37

  • Pero, ¿cómo se pueden cambiar los límites de la etiqueta y el eje con este enfoque? si uso ax1.ylabel dice que no se encuentra. Lo mismo con fig1.ylabel

    – George Datseris

    28 de agosto de 2016 a las 7:45

  • @GeorgeDatseris La sintaxis es un poco diferente. Es ax1.set_xlabel("your x label"), ax1.set_ylabel("your y label")y ax1.set_title("your title").

    – Simonb

    12/09/2016 a las 14:43

  • ¿Por qué usaste 111?

    – Yash Soda

    16 mayo 2018 a las 12:53

  • @yashSodha: esa es una especificación de estilo matlab del número de subparcelas (filas, columna, índice). Pero ahora es mucho más fácil de usar plt.subplots(nrows, ncols). Han actualizado el ejemplo.

    – Simonb

    10 jun 2018 a las 18:55

avatar de usuario
agf

Cuando usted llama figuresimplemente numere la trama.

x = arange(5)
y = np.exp(5)
plt.figure(0)
plt.plot(x, y)

z = np.sin(x)
plt.figure(1)
plt.plot(x, z)

w = np.cos(x)
plt.figure(0) # Here's the part I need
plt.plot(x, w)

Editar: tenga en cuenta que puede numerar las parcelas como desee (aquí, a partir de 0) pero si no proporciona ninguna figura con un número cuando crea una nueva, la numeración automática comenzará en 1 (“Estilo Matlab” según los documentos).

  • Esto parece funcionar en el modo interactivo de matplotlib, mientras que el método figure() … add_subplot() no lo hace. ¡Gracias!

    – chbrown

    02/04/2014 a las 22:02

  • @SebMa No cambie el código sin entenderlo. Esta respuesta fue específicamente sobre pasar un número a figure, que eliminaste. Las otras cosas que cambiaste fueron copiadas de la publicación original y no errores en mi respuesta.

    – agf

    16 de junio de 2018 a las 15:02

  • @agf Hola, eliminé el 1 en el interior plt.figure(1) porque pensé que el número se incrementaba automáticamente y, por lo tanto, no era necesario. Lo siento.

    – SebMa

    16 jun 2018 a las 16:35

avatar de usuario
ross b

Sin embargo, la numeración comienza en 1asi que:

x = arange(5)
y = np.exp(5)
plt.figure(1)
plt.plot(x, y)

z = np.sin(x)
plt.figure(2)
plt.plot(x, z)

w = np.cos(x)
plt.figure(1) # Here's the part I need, but numbering starts at 1!
plt.plot(x, w)

Además, si tiene varios ejes en una figura, como subtramas, use el axes(h) comando donde h es el identificador del objeto de ejes deseado para centrarse en esos ejes.

(Todavía no tengo privilegios para comentar, ¡perdón por la nueva respuesta!)

  • 0 obras, automático la numeración comienza en 1si no le das ningún número.

    – agf

    2 de agosto de 2011 a las 19:26


La respuesta aceptada aquí dice usar el interfaz orientada a objetos (es decir matplotlib), que es el camino a seguir. El código de la respuesta incorpora el (algunos de los) Interfaz estilo MATLAB (es decir matplotib.pyplot) sin embargo.

Existe la opción de usar únicamente el OOP método sin embargo, que puede abordar directamente el problema en cuestión y permitirnos trabajar con más de una figura a la vez:

import numpy as np
import matplotlib

x = np.arange(5)
y = np.exp(x)
first_figure      = matplotlib.figure.Figure()
first_figure_axis = first_figure.add_subplot()
first_figure_axis.plot(x, y)

z = np.sin(x)
second_figure      = matplotlib.figure.Figure()
second_figure_axis = second_figure.add_subplot()
second_figure_axis.plot(x, z)

w = np.cos(x)
first_figure_axis.plot(x, w)

display(first_figure) # Jupyter
display(second_figure)

Esto le da al usuario control manual sobre las cifras y evita problemas asociados con pyplotEl estado interno de admite solo una figura, como cuando desea devolver una figura de una función de biblioteca.

Una manera fácil de trazar marcos separados para cada iteración podría ser:

import matplotlib.pyplot as plt  
for grp in list_groups:
        plt.figure()
        plt.plot(grp)
        plt.show()

Luego, Python trazará diferentes marcos.

Una forma que encontré después de algunas dificultades es crear una función que obtiene la matriz data_plot, el nombre del archivo y el orden como parámetro para crear diagramas de caja a partir de los datos dados en la figura ordenada (diferentes órdenes = diferentes figuras) y guardarlos bajo el nombre del archivo dado.

def plotFigure(data_plot,file_name,order):
    fig = plt.figure(order, figsize=(9, 6))
    ax = fig.add_subplot(111)
    bp = ax.boxplot(data_plot)
    fig.savefig(file_name, bbox_inches="tight")
    plt.close()

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad