Підплоти Matplotlib різного розміру


237

Мені потрібно додати дві фігури до фігури. Один субплот повинен бути приблизно втричі ширшим, ніж другий (однакової висоти). Я зробив це за GridSpecдопомогою colspanаргументу, але я хотів би зробити це, використовуючи, figureщоб я міг зберегти в PDF. Я можу налаштувати першу цифру, використовуючи figsizeаргумент у конструкторі, але як я можу змінити розмір другого сюжету?


2
Gridspec працює з нормальною фігурою.
tillsten

Відповіді:


371

Інший спосіб - використовувати subplotsфункцію та передавати співвідношення ширини за допомогою gridspec_kw:

import numpy as np
import matplotlib.pyplot as plt 

# generate some data
x = np.arange(0, 10, 0.2)
y = np.sin(x)

# plot it
f, (a0, a1) = plt.subplots(1, 2, gridspec_kw={'width_ratios': [3, 1]})
a0.plot(x, y)
a1.plot(y, x)

f.tight_layout()
f.savefig('grid_figure.pdf')

1
Дякую за це; plt.subplotsспосіб робити речі набагато чистіше ІМО.
Люк Девіс

2
Мені подобаються субплоти краще, ніж gridspec, тому що вам більше не доведеться мати справу з налаштуваннями списку для осі (з gridspec вам все одно потрібно робити вісь та графіки по черзі). Тож субплоти є чистішими та швидшими у використанні
Eelco van Vliet

3
Що робити, якщо я хочу, щоб дві ділянки в одному ряду також відрізнялися за висотою? Зміна, height_ratioсхоже, вплине на весь ряд відносно інших рядків.
Мітчелл ван Зуйлен

Це неможливо через функцію субплотів. Однак ви можете додати щось подібне до коду вище: з mpl_toolkits.axes_grid1 імпорту make_axes_locatable роздільник = make_axes_locatable (a0) a_empty = deleer.append_axes ("дно", розмір = "50%") a_empty.axis ('off')
Ханьє

2
Я отримую цю помилку ValueError: Expected the given number of height ratios to match the number of rows of the grid. Я вирішив це, сказавши {'width_ratios':[1]}за 1 ряд тощо
Маркус Вебер

223

Ви можете використовувати gridspecта figure:

import numpy as np
import matplotlib.pyplot as plt 
from matplotlib import gridspec

# generate some data
x = np.arange(0, 10, 0.2)
y = np.sin(x)

# plot it
fig = plt.figure(figsize=(8, 6)) 
gs = gridspec.GridSpec(1, 2, width_ratios=[3, 1]) 
ax0 = plt.subplot(gs[0])
ax0.plot(x, y)
ax1 = plt.subplot(gs[1])
ax1.plot(y, x)

plt.tight_layout()
plt.savefig('grid_figure.pdf')

Отриманий сюжет


31

Мабуть, найпростіший спосіб - це використання subplot2grid, описане в Настроювання розташування Subplot за допомогою GridSpec .

ax = plt.subplot2grid((2, 2), (0, 0))

дорівнює

import matplotlib.gridspec as gridspec
gs = gridspec.GridSpec(2, 2)
ax = plt.subplot(gs[0, 0])

тому прикладом bmu стає:

import numpy as np
import matplotlib.pyplot as plt

# generate some data
x = np.arange(0, 10, 0.2)
y = np.sin(x)

# plot it
fig = plt.figure(figsize=(8, 6))
ax0 = plt.subplot2grid((1, 3), (0, 0), colspan=2)
ax0.plot(x, y)
ax1 = plt.subplot2grid((1, 3), (0, 2))
ax1.plot(y, x)

plt.tight_layout()
plt.savefig('grid_figure.pdf')

29

Я використовував pyplot«s axesоб'єкт вручну налаштувати розміри без використання GridSpec:

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 0.2)
y = np.sin(x)

# definitions for the axes
left, width = 0.07, 0.65
bottom, height = 0.1, .8
bottom_h = left_h = left+width+0.02

rect_cones = [left, bottom, width, height]
rect_box = [left_h, bottom, 0.17, height]

fig = plt.figure()

cones = plt.axes(rect_cones)
box = plt.axes(rect_box)

cones.plot(x, y)

box.plot(y, x)

plt.show()

2
Корисно для тих із нас, хто ще на matplotlib 0,99 без gridspec!
тайм

3
Корисно для тих, де gridspec неадекватний
дрімати

Найкраща відповідь коли-небудь. Саме те, що потрібно, якщо ви хочете робити субплоти різних розмірів (2D і 3D) і хочете, щоб вони мали різний розмір. Це також досить легко зрозуміти. Дякую!
МО
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.