Matplotlib subplots kích thước khác nhau


235

Tôi cần thêm hai ô con vào một hình. Một subplot cần rộng gấp khoảng ba lần so với cái thứ hai (cùng chiều cao). Tôi đã hoàn thành việc này bằng cách sử dụng GridSpeccolspanđối số nhưng tôi muốn làm điều này bằng cách sử dụng figuređể tôi có thể lưu vào PDF. Tôi có thể điều chỉnh hình đầu tiên bằng cách sử dụng figsizeđối số trong hàm tạo, nhưng làm cách nào để thay đổi kích thước của ô thứ hai?


2
Gridspec hoạt động với một con số bình thường.
tillsten

Câu trả lời:


369

Một cách khác là sử dụng subplotshàm và vượt qua tỷ lệ chiều rộng với 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
Cảm ơn vì điều đó; các plt.subplotscách làm việc nhiều bụi imo.
Luke Davis

2
Tôi thích các ô con tốt hơn gridspec vì bạn không phải đối phó với việc thiết lập danh sách cho trục nữa (với gridspec bạn vẫn cần tạo trục và các ô lần lượt). Vì vậy, các subplots sạch hơn và nhanh hơn để sử dụng thực sự
Eelco van Vliet

3
Điều gì sẽ xảy ra nếu tôi muốn hai ô trong một hàng cũng có chiều cao khác nhau? Thay đổi height_ratioxuất hiện để tác động đến toàn bộ hàng so với các hàng khác.
Mitchell van Zuylen

Điều đó là không thể thông qua chức năng subplots. Tuy nhiên, bạn có thể thêm một cái gì đó như thế này vào mã ở trên: từ mpl_toolkits.axes_grid1 nhập make_axes_locitable spliter = make_axes_locitable (a0) a_empty = spliter.append_axes ("bottom", size = "
Hagne

2
Tôi nhận được lỗi này ValueError: Expected the given number of height ratios to match the number of rows of the grid. Tôi đã giải quyết nó bằng cách nói {'width_ratios':[1]}cho 1 hàng, v.v.
Markus Weber

223

Bạn có thể sử dụng gridspecfigure:

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')

kết quả cốt truyện


31

Có lẽ cách đơn giản nhất là sử dụng subplot2grid, được mô tả trong Tùy chỉnh vị trí của Subplot bằng GridSpec .

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

bằng

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

vì vậy ví dụ của bmu trở thành:

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

Tôi đã từng pyplot's axesđối tượng để tự điều chỉnh kích thước mà không sử dụng 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
Hữu ích cho những người trong chúng ta vẫn còn trên matplotlib 0.99 mà không có gridspec!
timday

3
Hữu ích cho những nơi mà gridspec không đầy đủ
dreab

Câu trả lời hay nhất đến nay. Chính xác những gì cần thiết nếu bạn muốn thực hiện các ô con có kích thước khác nhau (2D và 3D) và muốn chúng có kích thước khác nhau. Nó cũng khá dễ hiểu. Cảm ơn bạn!
MO
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.