我通过学习示例来学习使用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')
答案 0 :(得分:235)
plt.subplots()
是一个返回包含图形和轴对象的元组的函数。因此,在使用fig, ax = plt.subplots()
时,您将此元组解压缩到变量fig
和ax
中。如果您想要更改图形级属性或稍后将图形保存为图像文件(例如使用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)
答案 3 :(得分:0)
除了上面的答案外,您还可以使用type(plt.subplots())
检查对象的类型,该对象返回一个元组,另一方面,type(plt.subplot())
返回的matplotlib.axes._subplots.AxesSubplot
无法解包