Matplotlib不同大小的子图


236

我需要在图中添加两个子图。一个子图的宽度大约是第二个子图的三倍(相同的高度)。我使用GridSpeccolspan参数完成了此操作,但是我想使用来完成此操作,figure因此可以保存为PDF。我可以使用figsize构造函数中的参数调整第一个图形,但是如何更改第二个图形的大小?


2
Gridspec使用正常图形。
耕till

Answers:


370

另一种方法是使用该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
与网格规格相比,我更喜欢子图,因为您不必再​​为轴设置列表了(使用网格规格,您仍然需要使轴和图一一对应)。因此,子图确实更干净,更快捷地使用
Eelco van Vliet

3
如果我希望一行中的两个图的高度也不同怎么办?height_ratio相对于其他行,更改似乎会影响整个行。
米切尔·范·祖伦

通过subplots功能是不可能的。但是,您可以在上面的代码中添加以下内容:从mpl_toolkits.axes_grid1 import make_axes_locatable除法器= make_axes_locatable(a0)a_empty =除法器。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

您可以使用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')

结果图


31

可能最简单的方法是使用subplot2grid,如使用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

我使用pyplotaxes对象来手动调整尺寸,而无需使用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的我们来说非常有用!
2012年

3
对于那些网格规格不足的人有用
dreab

有史以来最好的答案。如果您要进行不同尺寸(2D和3D)的子图,并希望它们具有不同的大小,则正是需要的。这也很容易理解。谢谢!
MO
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.