Matplotlib ukuran subplot yang berbeda


237

Saya perlu menambahkan dua subplot ke gambar. Satu subplot harus sekitar tiga kali lebih lebar dari yang kedua (ketinggian yang sama). Saya menyelesaikan ini menggunakan GridSpecdan colspanargumen tetapi saya ingin melakukan ini menggunakan figuresehingga saya dapat menyimpan ke PDF. Saya dapat menyesuaikan gambar pertama menggunakan figsizeargumen di konstruktor, tetapi bagaimana cara mengubah ukuran plot kedua?


2
Gridspec bekerja dengan angka normal.
tillsten

Jawaban:


371

Cara lain adalah dengan menggunakan subplotsfungsi dan lulus rasio lebar dengan 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
Terima kasih untuk ini; dengan plt.subplotscara melakukan sesuatu jauh lebih bersih imo.
Luke Davis

2
Saya suka subplot lebih baik daripada gridspec karena Anda tidak harus berurusan dengan pengaturan daftar sumbu lagi (dengan gridspec Anda masih perlu membuat sumbu dan plot satu per satu). Jadi subplot lebih bersih dan lebih cepat digunakan
Eelco van Vliet

3
Bagaimana jika saya ingin kedua plot dalam satu baris juga memiliki ketinggian yang berbeda? Mengubah height_ratiotampaknya memengaruhi seluruh baris relatif terhadap baris lain.
Mitchell van Zuylen

Itu tidak mungkin melalui fungsi subplot. Namun, Anda dapat menambahkan sesuatu seperti ini ke kode di atas: dari mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable (a0) a_empty = divider.append_axes ("bottom", size = "50%") a_empty.axis ('off')
Hagne

2
Saya mendapatkan kesalahan ini ValueError: Expected the given number of height ratios to match the number of rows of the grid. Saya menyelesaikannya dengan mengatakan {'width_ratios':[1]}1 baris, dll.
Markus Weber

223

Anda dapat menggunakan gridspecdan 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')

plot yang dihasilkan


31

Mungkin cara paling sederhana adalah menggunakan subplot2grid, dijelaskan dalam Menyesuaikan Lokasi Subplot Menggunakan GridSpec .

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

adalah sama dengan

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

jadi contoh bmu menjadi:

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

Saya menggunakan pyplot's axesobjek untuk menyesuaikan ukuran secara manual tanpa menggunakan 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
Berguna bagi kita yang masih menggunakan matplotlib 0.99 tanpa gridspec!
timday

3
Berguna untuk orang-orang di mana gridspec tidak memadai
dreab

Jawaban terbaik yang pernah ada. Persis apa yang diperlukan jika Anda ingin melakukan subplot dengan dimensi yang berbeda (2D dan 3D) dan ingin agar memiliki ukuran yang berbeda. Ini juga cukup mudah dimengerti. Terima kasih!
MO
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.