为什么许多例子使用" fig,ax = plt.subplots()"在Matplotlib / pyplot / python

时间:2015-12-08 17:39:40

标签: python matplotlib plot visualization

我通过学习示例来学习使用matplotlib,并且在创建单个绘图之前,很多示例似乎包含如下所示的行...

fig, ax = plt.subplots()

以下是一些例子......

我看到这个函数用了很多,尽管这个例子只是试图创建一个图表。还有其他一些优势吗? subplots()的官方演示在创建单个图表时也使用f, ax = subplots,之后它只引用了ax。这是他们使用的代码。

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')

4 个答案:

答案 0 :(得分:235)

plt.subplots()是一个返回包含图形和轴对象的元组的函数。因此,在使用fig, ax = plt.subplots()时,您将此元组解压缩到变量figax中。如果您想要更改图形级属性或稍后将图形保存为图像文件(例如使用fig,则fig.savefig('yourfilename.png')非常有用。您当然不必使用返回的图形对象,但很多人以后要使用它,所以常见。另外,所有轴对象(具有绘图方法的对象)都有一个父图形对象,因此:

fig, ax = plt.subplots()

比这更简洁:

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

答案 1 :(得分:30)

这里只是一个补充。

以下问题是如果我想在图中有更多的子图?

正如文档中所提到的,我们可以使用fig = plt.subplots(nrows=2, ncols=2)在一个图形对象中设置一组带有网格(2,2)的子图。

然后据我们所知,fig, ax = plt.subplots()会返回一个元组,让我们首先尝试fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)

ValueError: not enough values to unpack (expected 4, got 2)

它引发了一个错误,但不用担心,因为我们现在看到plt.subplots()实际上返回了一个包含两个元素的元组。第一个必须是一个图形对象,另一个应该是一组子图对象。

所以让我们再试一次:

fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(nrows=2, ncols=2)

并检查类型:

type(fig) #<class 'matplotlib.figure.Figure'>
type(ax1) #<class 'matplotlib.axes._subplots.AxesSubplot'>

当然,如果您使用参数(nrows = 1,ncols = 4),则格式应为:

fig, [ax1, ax2, ax3, ax4] = plt.subplots(nrows=1, ncols=4)

所以请记住保持列表的构造与我们在图中设置的子图网格相同。

希望这会对你有所帮助。

答案 2 :(得分:1)

作为对问题和以上答案的补充,plt.subplots()plt.subplot()之间也有重要区别,请注意最后缺少的's'

一个人可以使用plt.subplots()一次创建所有子图,然后将子图的图形和轴(轴的复数)作为元组返回。可以将图形理解为在其中绘制草图的画布。

# create a subplot with 2 rows and 1 columns
fig, ax = plt.subplots(2,1)

如果要单独添加子图,则可以使用plt.subplot()。它仅返回一个子图的轴。

fig = plt.figure() # create the canvas for plotting
ax1 = plt.subplot(2,1,1) 
# (2,1,1) indicates total number of rows, columns, and figure number respectively
ax2 = plt.subplot(2,1,2)
ax3 = plt.subplot(2,1,3) 

但是,plt.subplots()是首选,因为它为您提供了更轻松的选项来直接自定义您的整个人物

# for example, sharing x-axis, y-axis for all subplots can be specified at once
fig, ax = plt.subplots(2,1, sharex=True, sharey=True)

Shared axes 而使用plt.subplot(),则必须为可能麻烦的每个轴分别指定。

答案 3 :(得分:0)

除了上面的答案外,您还可以使用type(plt.subplots())检查对象的类型,该对象返回一个元组,另一方面,type(plt.subplot())返回的matplotlib.axes._subplots.AxesSubplot无法解包