matplotlib: plots múltiples en una figura

Tengo un código:

import matplotlib.pyplot as plt def print_fractures(fractures): xpairs = [] ypairs = [] plt.figure(2) plt.subplot(212) for i in range(len(fractures)): xends = [fractures[i][1][0], fractures[i][2][0]] yends = [fractures[i][1][1], fractures[i][2][1]] xpairs.append(xends) ypairs.append(yends) for xends,yends in zip(xpairs,ypairs): plt.plot(xends, yends, 'b-', alpha=0.4) plt.show() def histogram(spacings): plt.figure(1) plt.subplot(211) plt.hist(spacings, 100) plt.xlabel('Spacing (m)', fontsize=15) plt.ylabel('Frequency (count)', fontsize=15) plt.show() histogram(spacings) print_fractures(fractures) 

Este código producirá la siguiente salida: Figura 1

Mis preguntas son:

1) ¿Por qué se están creando dos figuras separadas? Pensé que el comando de subplot los combinaría en una figura. Pensé que podrían ser los múltiples comandos plt.show (), pero traté de comentarlos y solo llamarlo una vez desde fuera de mis funciones y aún tengo 2 ventanas.

2) ¿Cómo puedo combinarlos en 1 figura correctamente? Además, me gustaría que los ejes de la figura 2 tengan la misma escala (es decir, 400 m en el eje x es la misma longitud que 400 m en el eje y). Del mismo modo, me gustaría estirar el histogtwig verticalmente también. ¿Cómo se logra esto?

Como ya observó, no puede llamar a figure() dentro de cada función si tiene la intención de usar solo una figura (una ventana). En su lugar, simplemente llame a subplot() sin llamar a show() dentro de la función. El show() pyplot a pyplot para crear una segunda figura SI estás en modo plt.ioff() . En el modo plt.ion() puede mantener las llamadas plt.show() dentro del contexto local (dentro de la función).

Para lograr la misma escala para los ejes x e y, use plt.axis('equal') . A continuación puede ver una ilustración de este prototipo:

 from numpy.random import random import matplotlib.pyplot as plt def print_fractures(): plt.subplot(212) plt.plot([1,2,3,4]) def histogram(): plt.subplot(211) plt.hist(random(1000), 100) plt.xlabel('Spacing (m)', fontsize=15) plt.ylabel('Frequency (count)', fontsize=15) histogram() print_fractures() plt.axis('equal') plt.show()