我有以下内容:
import matplotlib.pyplot as plt
fig = plt.figure()
for i in range(10):
ax = fig.add_subplot(551 + i)
ax.plot([1,2,3,4,5], [10,5,10,5,10], 'r-')
我想象55
意味着它正在创建一个5个子图宽和5个子图深的网格 - 所以可以满足25个子图?
for循环只会迭代10次 - 所以我认为(显然是错误的)25个可能的情节可以容纳那些迭代,但我得到以下内容:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-118-5775a5ea6c46> in <module>()
10
11 for i in range(10):
---> 12 ax = fig.add_subplot(551 + i)
13 ax.plot([1,2,3,4,5], [10,5,10,5,10], 'r-')
14
/home/blah/anaconda/lib/python2.7/site-packages/matplotlib/figure.pyc in add_subplot(self, *args, **kwargs)
1003 self._axstack.remove(ax)
1004
-> 1005 a = subplot_class_factory(projection_class)(self, *args, **kwargs)
1006
1007 self._axstack.add(key, a)
/home/blah/anaconda/lib/python2.7/site-packages/matplotlib/axes/_subplots.pyc in __init__(self, fig, *args, **kwargs)
62 raise ValueError(
63 "num must be 1 <= num <= {maxn}, not {num}".format(
---> 64 maxn=rows*cols, num=num))
65 self._subplotspec = GridSpec(rows, cols)[int(num) - 1]
66 # num - 1 for converting from MATLAB to python indexing
ValueError: num must be 1 <= num <= 30, not 0
答案 0 :(得分:2)
在便捷速记符号中,55
表示有5行5列。但是,简写符号仅适用于单位数整数(即nrows,ncols和plot_number都小于10)。
您可以将其扩展为完整的表示法(即使用逗号:add_subplot(nrows, ncols, plot_number)
),然后一切都可以正常使用:
for i in range(10):
ax = fig.add_subplot(5, 5, 1 + i)
ax.plot([1,2,3,4,5], [10,5,10,5,10], 'r-')
来自plt.subplot
的文档(使用与fig.add_subplot
相同的参数):
典型的呼叫签名:
subplot(nrows, ncols, plot_number)
使用nrows和ncols在概念上将图形分割为nrows * ncols子轴,并且 plot_number用于标识此特定子图 功能是在名义网格内创建。 plot_number从 1,首先跨行递增,最多为nrows * ncols。
在nrows,ncols和plot_number都小于10 的情况下,存在便利性,因此可以给出3位数字 相反,数百代表nrows,数十代表ncols 而单位代表plot_number。
答案 1 :(得分:1)
虽然汤姆回答了你的问题,但在这种情况下你应该使用fig, axs = plt.subplots(n, m)
。这将创建一个包含n
行和m
列子图的新图。 fig
是创建的数字。 axs
是一个2D numpy数组,其中数组中的每个元素都是图中相应位置的子图。因此,右上角元素axs
是图中右上角的子图。您可以通过正常索引访问子图,或循环遍历它们。
所以在你的情况下你可以做到
import matplotlib.pyplot as plt
# axs is a 5x5 numpy array of axes objects
fig, axs = plt.subplots(5, 5)
# "ravel" flattens the numpy array without making a copy
for ax in axs.ravel():
ax.plot([1,2,3,4,5], [10,5,10,5,10], 'r-')