302 votes

Matplotlib : des sous-points de taille différente

Je dois ajouter deux intrigues secondaires à une figure. L'un des sous-plots doit être environ trois fois plus large que le second (même hauteur). Pour ce faire, j'ai utilisé GridSpec et le colspan mais je voudrais le faire en utilisant figure pour que je puisse sauvegarder en PDF. Je peux ajuster la première figure en utilisant le figsize dans le constructeur, mais comment puis-je changer la taille du second tracé ?

478voto

Hagne Points 6172

enter image description here

  • Comme la question est canonique, voici un exemple avec des sous-intrigues verticales.

    plot it

    f, (a0, a1, a2) = plt.subplots(3, 1, gridspec_kw={'height_ratios': [1, 1, 3]})

    a0.plot(x, y) a1.plot(x, y) a2.plot(x, y)

    f.tight_layout()

enter image description here

247voto

bmu Points 7109

Vous pouvez utiliser gridspec et 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')

enter image description here

36voto

strimp099 Points 1392

J'ai utilisé pyplot 's axes pour ajuster manuellement les tailles sans utiliser 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()

enter image description here

35voto

endolith Points 4183

Le moyen le plus simple est probablement d'utiliser subplot2grid décrit dans Personnalisation de l'emplacement du sous-graphe à l'aide de GridSpec .

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

est égal à

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

donc l'exemple de bmu devient :

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

enter image description here

6voto

Sohail Ahmed Points 29

De manière simple, il est également possible de réaliser des sous-tracés de tailles différentes sans gridspec :

plt.figure(figsize=(12, 6))
ax1 = plt.subplot(2,3,1)
ax2 = plt.subplot(2,3,2)
ax3 = plt.subplot(2,3,3)
ax4 = plt.subplot(2,1,2)
axes = [ax1, ax2, ax3, ax4]

Output

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X