Me gustaría tener un código que muestre opcionalmente una figura que se ha generado usando matplotlib en un cuaderno Jupyter. La razón por la que quiero esto es que las cifras se guardan en la unidad y, a veces, sería bueno no tener que mostrarlas en el propio portátil.

Además, me gustaría que fuera posible crear múltiples gráficos dentro de una sola celda con algunos mostrados y otros no mostrados.

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(-5, 5, 100)
y1 = t
y2 = t**2
show_fig1 = True
show_fig2 = True

fig1 = plt.figure()
ax1 = fig1.add_subplot(1, 1, 1)
ax1.plot(t,y1)
fig1.savefig('fig1.png')
print('Showing Figure 1:')
if show_fig1:
    plt.show()

fig2 = plt.figure()
ax2 = fig2.add_subplot(1, 1, 1)
ax2.plot(t,y2)
fig2.savefig('fig2.png')
print('Showing Figure 2:')
if show_fig2:
    plt.show()

print('Done Showing Figures')

El código anterior no funciona, pero es mi mejor esfuerzo.

Si show_fig1=False y show_fig2=True entonces fig1 termina mostrándose tan pronto como plt.show() es llamado en el bloque de código fig2.

Si show_fig1=True y show_fig2=False entonces fig1 se muestra correctamente pero fig2 todavía aparece al final de la celda (después de que se imprima "Listo mostrando figuras").

Si ambos son falsos, ambos gráficos aparecen al final de la celda.

He probado otras combinaciones como usar fig1.show() en lugar de plt.show() pero esto no parece funcionar. Probé varios ajustes, como usar o no usar %matplotlib inline o ion() y ioff().

¿Alguna sugerencia?

0
Jagerber48 1 oct. 2019 a las 17:32

1 respuesta

La mejor respuesta

Quizás esto funcione para ti:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(-5, 5, 100)
y1 = t
y2 = t**2
show_fig1 = True
show_fig2 = True

fig, ax = plt.subplots()
ax.plot(t, y1)
plt.savefig('fig1.png')
if show_fig1:
    plt.show()
else:
    plt.close()

fig, ax = plt.subplots()
ax.plot(t, y2)
plt.savefig('fig2.png')
if show_fig2:
    plt.show()
else:
    plt.close()

print('Done Showing Figures')
1
kwinkunks 1 oct. 2019 a las 15:28