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

92

Я написал код, который открывает сразу 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()
ФС.
источник

Ответы:

17

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

las3rjock
источник
202

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

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

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

plt.figure () (в котором plt или PLT обычно являются библиотекой pyplot matplotlib, импортированной и отсканированной как глобальная переменная, 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 (который, опять же, может быть записан в виде трех кортежей, так как (2,1,1) означает две строки и один столбец окон графика; третья цифра указывает порядок этого конкретного окна подзаголовка относительно других окон подзаголовка - -в данном случае это первый график (который помещает его в строку 1), следовательно, график номер 1, строка 1 col 1.

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

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

Обратите внимание, что каждый из четырех аргументов содержит две ведущие 2, которые кодируют конфигурацию 2 x 2, т. Е. Две строки и два столбца.

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

дуг
источник
1
add_subplot может принимать один целочисленный аргумент для небольшого числа подзаголовков, но если вам нужно более 9 подзаголовков, вы должны использовать версию из других ответов, которая принимает 3 отдельных целочисленных аргумента.
user1244215
1
можно использовать fig.add_axes(rect)вместо add_subplot?
Alcott
16
PLT? Никогда раньше не видел, чтобы это использовалось
Даршан Чаудхари
3
Ваш первый абзац здесь явно неверен, в чем вы можете убедиться, запустив for i in range(16): plt.subplot(4, 4, i+1)и не обнаружив синтаксических ошибок. Ответ принят, потому что он, вероятно, сделал то, что хотел OP.
chthonicdaemon
3
Это хорошее решение. Но если я хочу использовать одну переменную для цикла, как это сделать?
Pengju Zhao
83

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

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

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

Саулло Г. П. Кастро
источник
Работает ли это также в тех случаях, когда мне нужно использовать только API-интерфейс matplotlib (из-за недоступности отображения и других забавных вещей)?
eudoxos
2
@eudoxos да, это должно быть, вы можете создавать такие подзаголовки, чтобы, например, печатать несколько графических изображений на одной странице, без необходимости показывать, что делается
Saullo GP Castro
12

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

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

Всего на одной странице отображается 19 графиков. Формат 5 вниз и 4 поперек ..

ФС.
источник
4

@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()
Пэнджу Чжао
источник
Если во фрейме данных есть именованные столбцы, вам нужно будет использовать что-то вродеfor i,col in enumerate(df.columns):
drevicko