子图的索引如何工作

时间:2016-06-22 14:50:31

标签: python matplotlib

我有以下内容:

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

2 个答案:

答案 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-')