Як зробити кілька графіків на одній сторінці за допомогою matplotlib?


91

Я написав код, який відкриває відразу 16 цифр. В даний час всі вони відкриваються як окремі графіки. Я хотів би, щоб вони відкривалися на одній сторінці. Не той самий графік. Я хочу 16 окремих графіків на одній сторінці / вікні. Також з якихось причин формат числових і за замовчуванням неперевищуваних значень не відповідає фігурі 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)має працювати.


201

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

Враховуючи, що це прийнята відповідь і вона вже отримала кілька голосів "за", я гадаю, невелика деконструкція в порядку.

По- перше, називаючи сюжетні це НЕ дасть вам кілька ділянок; subplot покликаний створити єдиний сюжет, а також створити кілька сюжетів. Крім того, "зміна plt.figure (i)" невірна.

plt.figure () (в яких рх або 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 колонка 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 col 1 (1), рядок 1 col 2 (2), рядок 2 колона 1 (3), ряд 2 колона 2 (4).


1
add_subplot може взяти один цілочисельний аргумент для невеликої кількості підзаголовків, але як тільки вам потрібно більше 9 підзаговорень, ви повинні використовувати версію з інших відповідей, яка бере 3 окремі цілочисельні аргументи.
user1244215

1
я можу використовувати fig.add_axes(rect)замість add_subplot?
Alcott,

15
PLT? Ніколи раніше не бачив, щоб це використовували
Даршан Чаудхарі,

3
Ваш перший абзац тут явно не відповідає дійсності, оскільки ви можете перевірити, запустивши for i in range(16): plt.subplot(4, 4, i+1)та не помітивши помилки в синтаксисі. Відповідь прийнято, тому що він, мабуть, зробив те, що хотів ОП.
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.