matplotlib: несколько графиков на одном рисунке

У меня есть код:

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)

этот код выдаст следующий вывод: Fig1

мои вопросы:

1) Почему создаются две отдельные цифры? Я думал, что команда subplot объединит их в одну фигуру. Я думал, что это может быть несколько ПЛТ.команды show (), но я попытался прокомментировать их и только один раз вызвать его из-за пределов моих функций, и у меня все еще есть 2 окна.

2) Как я могу объединить их в 1 правильно вычислить? Кроме того, я хотел бы, чтобы оси рисунка 2 имели одинаковый масштаб (т. е. 400 м на оси x такая же длина, как 400 м на оси y). Точно так же я хотел бы растянуть гистограмму по вертикали - как это делается?

1 ответов


как вы уже заметили, вы не можете позвонить figure() внутри каждой функции, если вы собираетесь использовать только один деятель (одно окно). Вместо этого, просто позвоните subplot() без вызова show() внутри функции. The show() будет силу pyplot создать вторую фигуру если вы находитесь в plt.ioff() режим. В plt.ion() режим вы можете сохранить plt.show() вызовы внутри локального контекста (внутри функции).

для достижения одинакового масштаба для осей x и y используйте plt.axis('equal'). Ниже вы можете увидеть иллюстрация этого прототипа:

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()