Matplotlib farklı boyut alt grafikleri


237

Bir şekle iki alt grafik eklemem gerekiyor. Bir alt grafiğin ikinciden yaklaşık üç kat daha geniş olması gerekir (aynı yükseklik). Bunu GridSpecve colspanargümanı kullanarak başardım ama figurePDF'ye kaydedebilmem için bunu kullanarak yapmak istiyorum . İlk şekli figsizeyapıcıdaki argümanı kullanarak ayarlayabilirim , ancak ikinci arsanın boyutunu nasıl değiştirebilirim?


2
Gridspec normal bir rakamla çalışır.
28'e kadar

Yanıtlar:


371

Başka bir yol, subplotsişlevi kullanmak ve genişlik oranını şu değerlerle iletmektir 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
Bunun için teşekkürler; bir plt.subplotsşeyler yapmanın yolu daha temiz imo.
Luke Davis

2
Artık alt listeyi gridspec'ten daha iyi seviyorum çünkü artık eksenin listesini yukarı ayarlarla uğraşmak zorunda değilsiniz (gridspec ile hala ekseni ve grafikleri tek tek yapmanız gerekir). Yani alt
alanlar

3
Bir satırdaki iki parselin yükseklik bakımından da farklı olmasını istersem ne olur? Değişikliğin height_ratiotüm satırı diğer satırlara göre etkilediği görülmektedir.
Mitchell van Zuylen

Bu alt grafikler fonksiyonuyla mümkün değildir. Ancak, yukarıdaki koda böyle bir şey ekleyebilirsiniz: mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable (a0) a_empty = divider.append_axes ("alt", boyut = "% 50") a_empty.axis ('kapalı')
Hagne

2
Bu hatayı alıyorum ValueError: Expected the given number of height ratios to match the number of rows of the grid. {'width_ratios':[1]}1 satır vb. Söyleyerek
Markus Weber

223

Sen kullanabilirsiniz gridspecve 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')

ortaya çıkan arsa


31

Muhtemelen basit yolu kullanıyor subplot2grid, açıklanan GridSpec kullanma subplot ait Özelleştirme yer .

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

eşittir

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

bmu örneği şöyle olur:

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

Kullandığım pyplot'ın axesel kullanmadan boyutları düzenlemek nesne 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
Hala gridspec olmadan matplotlib 0.99 üzerinde olanlar için kullanışlıdır!
timday

3
Gridspec'in yetersiz olduğu yerlerde kullanışlıdır
17:13

En iyi cevap. Farklı boyutlarda (2D ve 3D) alt grafikler yapmak ve farklı boyutlara sahip olmak istiyorsanız tam olarak neye ihtiyaç duyulur. Bunu anlamak da oldukça kolay. Teşekkür ederim!
MO
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.