我需要给一个图加上两个子图。一个副地块的宽度需要是第二个地块的三倍(高度相同)。我使用GridSpec和colspan参数完成了这一点,但我想使用figure这样我就可以保存到PDF。我可以使用构造函数中的figsize参数调整第一个图形,但如何改变第二个图形的大小呢?
GridSpec
colspan
figure
figsize
我使用pyplot的axes对象手动调整大小,而不使用GridSpec:
pyplot
axes
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()
你可以使用gridspec和figure:
gridspec
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')
可能最简单的方法是使用subplot2grid,在使用GridSpec自定义Subplot的位置中描述。
subplot2grid
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')
matplotlib 3.6.0
width_ratios
height_ratios
plt.subplots
subplot_mosaic
f, (a0, a1) = plt.subplots(1, 2, width_ratios=[3, 1])
f, (a0, a1, a2) = plt.subplots(3, 1, height_ratios=[1, 1, 3])
subplots
gridspec_kw
matplotlib.gridspec.GridSpec
gridspect_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')
# 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()
简单地说,不同大小的子绘图也可以在没有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]
在matplotlib 3.3.0, subplot_mosaic中添加了一个很好的方法。
matplotlib 3.3.0
你可以使用“ASCII art"风格。
例如
fig, axes = plt.subplot_mosaic("ABC;DDD")
上面一行有三个轴,下面一行有一个横跨整个宽度的轴
这个方法的一个好处是,从函数返回的axes是一个包含你定义的名称的字典,使它更容易跟踪什么是什么。
axes["A"].plot([1, 2, 3], [1, 2, 3])
如果你想使用较长的名称,也可以将列表的列表传递给subplot_mosaic
fig, axes = plt.subplot_mosaic( [["top left", "top centre", "top right"], ["bottom row", "bottom row", "bottom row"]] ) axes["top left"].plot([1, 2, 3], [1, 2, 3])
会产生相同的数字吗