Как сделать несколько графиков на одной странице с помощью 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)должно сработать.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.