2016-06-22 4 views
0

Ich habe folgendes:Wie funktioniert die Indizierung von Nebenhandlungen arbeiten

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

Ich habe mir vorgestellt, dass die 55 bedeutet, dass es ein Gitter schafft, die breit 5 Nebenhandlungen und 5 Nebenhandlungen tief - so kann für 25 sorgen Nebenhandlungen?

Die for-Schleife wird durchlaufen nur 10-mal - so dachte ich (offensichtlich zu Unrecht), dass 25 mögliche Plots diese Iterationen ok empfangen würde, aber ich folgendes:

--------------------------------------------------------------------------- 
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 

Antwort

2

In der convience Kurzschreibweise, die 55 bedeutet, dass es 5 Zeilen und 5 Spalten gibt. Die Kurzschreibweise funktioniert jedoch nur für einstellige Ganzzahlen (d. H. Für nrows, ncols und plot_number alle kleiner als 10).

Sie können die volle Notation erweitern (dh durch Kommas: add_subplot(nrows, ncols, plot_number)) und dann wird alles für Sie funktionieren:

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

Aus der Dokumentation für plt.subplot (die die gleichen Argumente wie fig.add_subplot verwendet):

Typische Anruf Signatur:

subplot(nrows, ncols, plot_number) 

Wo nrows und nco ls werden verwendet, um die Figur fiktiv in nrows * ncols-Unterachsen aufzuteilen, und plot_number wird verwendet, um den bestimmten Unterplot zu identifizieren, den diese -Funktion innerhalb des fiktiven Rasters erzeugen soll. plot_number beginnt bei 1, erhöht zuerst die Anzahl der Zeilen und hat ein Maximum von nrows * ncols.

In dem Fall, wenn nrows, ncols und plot_number sind alle weniger als 10, eine Bequemlichkeit vorhanden ist, so dass die eine 3-stellige Nummer kann statt gegeben werden, wo die Hunderte nrows darstellen, die Zehner darstellen ncols und Die Einheiten repräsentieren plot_number.

1

Obwohl Tom Ihre Frage beantwortet hat, sollten Sie in dieser Situation fig, axs = plt.subplots(n, m) verwenden. Dadurch wird eine neue Figur mit den Spalten n Zeilen und m Spalten von Unterplots erstellt. fig ist die Figur erstellt. axs ist ein 2D-Numpy-Array, bei dem jedes Element im Array das Subplot an der entsprechenden Stelle in der Abbildung ist. Das obere rechte Element axs ist also das obere rechte Teilplot in der Abbildung. Sie können auf die Unterplots durch normale Indizierung zugreifen oder sie überlappen.

Also in Ihrem Fall können Sie

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-') 
+0

stimme ich dies in der Regel der sauberere Weg ist; Dies erzeugt jedoch alle 25 Teilplots im 5x5-Raster, wobei der OP-Code nur die ersten 10 erzeugt. Sie können alle 25 oder nicht wollen; Ihr Code reproduziert nicht genau, was in der Frage enthalten ist. – tom

Verwandte Themen