Wie kann ich ein neues Plot dynamisch einer Menge von Unterplots hinzufügen, wenn ich mehr als eine Spalte verwende, um meine Unterplots anzuzeigen? This beantwortet diese Frage für eine Spalte, aber ich kann nicht die Antworten dort zu ändern scheinen, um es dynamisch mit x
Spalten zu einem subplot hinzufügenFügen Sie Unterplots in Matplotlib dynamisch mit mehr als einer Spalte hinzu
I Sadarthrion's answer geändert und die folgende versucht. Hier, für ein Beispiel, habe ich number_of_subplots=11
und num_cols = 3
gemacht.
import matplotlib.pyplot as plt
def plotSubplots(number_of_subplots,num_cols):
# Start with one
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1,2,3])
for j in range(number_of_subplots):
if j > 0:
# Now later you get a new subplot; change the geometry of the existing
n = len(fig.axes)
for i in range(n):
fig.axes[i].change_geometry(n+1, num_cols, i+1)
# Add the new
ax = fig.add_subplot(n+1, 1, n+1)
ax.plot([4,5,6])
plt.show()
plotSubplots(11,3)
Wie Sie dies mich nicht wird sehen können, zu geben, was ich will. Die erste Handlung nimmt alle Spalten und die zusätzlichen Flächen sind kleiner als sollten sie
seinEDIT:
('2.7.6 | 64-bit | (default, Sep 15 2014, 17:36:35) [MSC v.1500 64 bit (AMD64)]'
Auch habe ich matplotlib Version 1.4.3:
import matplotlib as mpl
print mpl.__version__
1.4.3
Ich versuchte Pauls Antwort unten und erhalte die folgende Fehlermeldung:
import math
import matplotlib.pyplot as plt
from matplotlib import gridspec
def do_plot(ax):
ax.plot([1,2,3], [4,5,6], 'k.')
N = 11
cols = 3
rows = math.ceil(N/cols)
gs = gridspec.GridSpec(rows, cols)
fig = plt.figure()
for n in range(N):
ax = fig.add_subplot(gs[n])
do_plot(ax)
fig.tight_layout()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-f74203b1c1bf> in <module>()
15 fig = plt.figure()
16 for n in range(N):
---> 17 ax = fig.add_subplot(gs[n])
18 do_plot(ax)
19
C:\Users\user\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\figure.pyc in add_subplot(self, *args, **kwargs)
962 self._axstack.remove(ax)
963
--> 964 a = subplot_class_factory(projection_class)(self, *args, **kwargs)
965
966 self._axstack.add(key, a)
C:\Users\user\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\axes\_subplots.pyc in __init__(self, fig, *args, **kwargs)
73 raise ValueError('Illegal argument(s) to subplot: %s' % (args,))
74
---> 75 self.update_params()
76
77 # _axes_class is set in the subplot_class_factory
C:\Users\user\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\axes\_subplots.pyc in update_params(self)
113 self.figbox, self.rowNum, self.colNum, self.numRows, self.numCols = 114 self.get_subplotspec().get_position(self.figure,
--> 115 return_all=True)
116
117 def is_first_col(self):
C:\Users\user\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\gridspec.pyc in get_position(self, fig, return_all)
423
424 figBottoms, figTops, figLefts, figRights = --> 425 gridspec.get_grid_positions(fig)
426
427
C:\Users\user\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\gridspec.pyc in get_grid_positions(self, fig)
103 cellHeights = [netHeight*r/tr for r in self._row_height_ratios]
104 else:
--> 105 cellHeights = [cellH] * nrows
106
107 sepHeights = [0] + ([sepH] * (nrows-1))
TypeError: can't multiply sequence by non-int of type 'float'
Wie würde die korrekte Ausgabe in diesem Fall aussehen? –
Oh Entschuldigung, ich dachte es wäre offensichtlich. Ich möchte nur, dass alle Pläne gefliest werden und so viel Platz wie möglich vom Fenster einnehmen. Also im obigen Beispiel möchte ich das Diagramm, das am unteren Rand erscheint, in der zweiten Spalte erscheinen. Der letzte Satz von Unterplots sollte als 4x3 (4 Zeilen, 3 Spalten) Gitter mit einem leeren Platz am Ende angezeigt werden (da wir nur 11 Plots haben) – Frikster
Kennen Sie die Anzahl der Spalten und die Gesamtzahl der Plots * a priori *? –