add_axes和add_subplot有什么区别?

时间:2017-04-10 15:04:27

标签: python matplotlib figure axes

在之前的answer中,建议我使用add_subplot代替add_axes来正确显示轴,但搜索文档时我无法理解何时以及为什么要使用这些功能中的任何一个。

任何人都可以解释这些差异吗?

2 个答案:

答案 0 :(得分:62)

共同点

add_axesadd_subplot都为图形添加轴。它们都返回matplotlib.axes.Axes个对象。

然而,用于添加轴的机制显着不同。

add_axes

add_axes的调用签名为add_axes(rect),其中rect是一个列表[x0, y0, width, height],表示图中的新轴的左下角坐标(x0,y0)及其宽度和高度。因此轴位于画布上的绝对坐标中。例如。

fig = plt.figure()
ax = fig.add_axes([0,0,1,1])

在画布中放置一个与画布本身一样大的图形。

add_subplot

add_subplot的调用签名不直接提供将轴放置在预定义位置的选项。它允许根据子图网格指定轴应位于何处。指定此位置的通常和最简单的方法是3整数表示法

fig = plt.figure()
ax = fig.add_subplot(231)

在此示例中,在2行3列的网格上的第一个位置(1)创建新轴。要仅生成单个轴,将使用add_subplot(111)(在1乘1子绘图网格上的第一个绘图)。

这种方法的优点是matplotlib可以处理精确的定位。默认情况下,add_subplot(111)会生成一个位于[0.125,0.11,0.775,0.77]或类似位置的轴,这些轴已经为标题和(刻度)标签留下了足够的空间。但是,此位置也可能会根据图表中的其他元素,标题集等进行更改。 它也可以使用pyplot.subplots_adjust(...)pyplot.tight_layout()进行调整。

在大多数情况下,add_subplot将是在画布上为绘图创建轴的首选方法。只有在确切定位很重要的情况下,add_axes才有用。

实施例

import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (5,3)

fig = plt.figure()
fig.add_subplot(241)
fig.add_subplot(242)
ax = fig.add_subplot(223)
ax.set_title("subplots")

fig.add_axes([0.77,.3,.2,.6])
ax2 =fig.add_axes([0.67,.5,.2,.3])
fig.add_axes([0.6,.1,.35,.3])
ax2.set_title("random axes")

plt.tight_layout()
plt.show()

enter image description here

替代

获取一个或多个子图及其句柄的最简单方法是plt.subplots()。对于一个轴,请使用

fig, ax = plt.subplots()

或者,如果需要更多的子图,

fig, axes = plt.subplots(nrows=3, ncols=4)

最初的问题

initial question中,使用fig.add_axes([0,0,1,1])放置了一个轴,使其紧靠图形边界。这样做的缺点当然是截止,勾选标签,轴标签和标题。因此,我在其中一条评论中建议使用fig.add_subplot,因为这会自动为这些元素留出足够的空间,如果这还不够,可以使用pyplot.subplots_adjust(...)或{{进行调整1}}。

答案 1 :(得分:0)

@ImportanceOfBeingErnest 的回答很棒。
然而,在这种情况下,人们通常希望为绘图生成一个轴,而 add_axes() 的开销太大。

所以一个技巧是,就像@ImportanceOfBeingErnest 的回答一样,是使用 add_subplot(111)
更优雅和简单的选择是:

hAx = plt.figure(figsize = (10, 10)).gca()

如果您想要 3D 投影,您可以传递任何轴属性。例如projection

hAx = plt.figure(figsize = (16, 10)).gca(projection = '3d')