Как сделать несколько графиков на одной странице с помощью matplotlib?

Я написал код, который сразу открывает 16 цифр. В настоящее время все они открыты как отдельные графики. Я бы хотел, чтобы они открывали все на одной странице. Не тот же график. Я хочу 16 отдельных графиков на одной странице/окне. Также по какой-то причине формат numbins и defaultreallimits не проходит мимо цифры 1. Нужно ли использовать команду subplot? Я не понимаю, зачем мне нужно, но не могу понять, что еще я буду делать?

import csv
import scipy.stats
import numpy
import matplotlib.pyplot as plt

for i in range(16):
    plt.figure(i)
    filename= easygui.fileopenbox(msg='Pdf distance 90m contour', title='select file', filetypes=['*.csv'], default='X:\\herring_schools\\')
    alt_file=open(filename)    
    a=[]
    for row in csv.DictReader(alt_file):
        a.append(row['Dist_90m(nmi)'])
    y= numpy.array(a, float)    
    relpdf=scipy.stats.relfreq(y, numbins=7, defaultreallimits=(-10,60))
    bins = numpy.arange(-10,60,10)
    print numpy.sum(relpdf[0])
    print bins
    patches=plt.bar(bins,relpdf[0], width=10, facecolor='black')
    titlename= easygui.enterbox(msg='write graph title', title='', default='', strip=True, image=None, root=None)
    plt.title(titlename)
    plt.ylabel('Probability Density Function')
    plt.xlabel('Distance from 90m Contour Line(nm)')
    plt.ylim([0,1])

plt.show()

Ответ 1

Чтобы ответить на ваш основной вопрос, вы хотите использовать команду subplot. Я думаю, что изменение plt.figure(i) до plt.subplot(4,4,i+1) должно работать.

Ответ 2

Ответ от las3rjock, который каким-то образом является ответом, принятым OP, неверен - код не запускается и не является синтаксисом matplotlib; этот ответ не дает никакого исполняемого кода и не содержит никакой информации или предположений о том, что OP может оказаться полезным при написании собственного кода для решения проблемы в OP.

Учитывая, что это принятый ответ и уже получил несколько голосов, я полагаю, что небольшая деконструкция в порядке.

Во-первых, вызов подзаголовка не дает вам несколько графиков; subplot вызывается для создания отдельного сюжета, а также для создания нескольких графиков. Кроме того, "изменение plt.figure(i)" неверно.

plt.figure() (в котором plt или PLT обычно является библиотекой matplotlib pyplot, импортированной и возвращаемой как глобальная переменная plt или иногда PLT, например:

from matplotlib import pyplot as PLT

fig = PLT.figure()

строка чуть выше создает экземпляр фигуры matplotlib; этот метод add_subplot объекта затем вызывается для каждого окна построения (неформально думать о оси x и y, содержащей один подзаговор). Вы создаете (будь то один или несколько на странице), например

fig.add_subplot(111)

этот синтаксис эквивалентен

fig.add_subplot(1,1,1)

выберите тот, который имеет смысл для вас.

Ниже я перечислил код для построения двух графиков на странице, один над другим. Форматирование выполняется с помощью аргумента, переданного в add_subplot. Обратите внимание, что аргумент равен (211) для первого графика и ( 212) для второго.

from matplotlib import pyplot as PLT

fig = PLT.figure()

ax1 = fig.add_subplot(211)
ax1.plot([(1, 2), (3, 4)], [(4, 3), (2, 3)])

ax2 = fig.add_subplot(212)
ax2.plot([(7, 2), (5, 3)], [(1, 6), (9, 5)])

PLT.show()

Каждый из этих двух аргументов является полной спецификацией для правильного размещения соответствующих окон графика на странице.

211 (который снова также может быть записан в 3-кортежной форме, так как (2,1,1) означает две строки и один столбец окон графика, а третья цифра указывает порядок конкретное окно подзаголовка по отношению к другим окнам подзаголовка - в этом случае это первый график (который помещает его в строку 1), следовательно, номер участка 1, строка 1 col 1.

Аргумент, переданный во второй вызов add_subplot, отличается от первого только конечной цифрой (вместо 2 вместо 1, поскольку этот график является вторым графиком (строка 2, col 1).

Пример с большим количеством графиков: если вместо этого вам потребовалось четыре графика на странице, в матричной конфигурации 2x2, вы бы четыре раза вызывали метод add_subplot, передавая эти четыре аргумента (221), (222), (223), и (224), чтобы создать четыре графика на странице в 10, 2, 8 и 4 часах соответственно и в этом порядке.

Обратите внимание, что каждый из четырех аргументов содержит две записи 2's - которая кодирует конфигурацию 2 x 2, то есть две строки и два столбца.

Третья (самая правая) цифра в каждом из четырех аргументов кодирует упорядочение этого конкретного окна графика в матрице 2 x 2, то есть строку 1 col 1 (1), строку 1 col 2 (2), строка 2 col 1 (3), строка 2 col 2 (4).

Ответ 3

Поскольку этот вопрос исходит от 4 лет назад, были реализованы новые вещи, и среди них есть новая функция plt.subplots, которая очень удобна:

fig, axes = plot.subplots(nrows=2, ncols=3, sharex=True, sharey=True)

где axes - это numpy.ndarray объектов AxesSubplot, что очень удобно пропускать различные подзаголовки, используя индексы массива [i,j].

Ответ 4

Это также работает:

for i in range(19):
    plt.subplot(5,4,i+1) 

Он отображает 19 общих графиков на одной странице. Формат составляет 5 и 4 дюйма.

Ответ 5

@doug и FS. Ответ - очень хорошие решения. Я хочу поделиться решением для итерации на pandas.dataframe.

import pandas as pd
df=pd.DataFrame([[1, 2], [3, 4], [4, 3], [2, 3]])
fig = plt.figure(figsize=(14,8))
for i in df.columns:
    ax=plt.subplot(2,1,i+1) 
    df[[i]].plot(ax=ax)
    print(i)
plt.show()