2016-07-22 16 views
4

Wie kann ich feststellen, ob ein Unterplot (AxesSubplot) leer ist oder nicht? Ich möchte leere Achsen von leeren Teilplots deaktivieren und komplett leere Zeilen entfernen.Leere Unterplots in Matplotlib entfernen Abbildung

Zum Beispiel sind in dieser Abbildung nur zwei Teilplots gefüllt und die restlichen Teilplots sind leer.

import matplotlib.pyplot as plt 

# create figure wit 3 rows and 7 cols; don't squeeze is it one list 
fig, axes = plt.subplots(3, 7, squeeze=False) 
x = [1,2] 
y = [3,4] 

# plot stuff only in two SubAxes; other axes are empty 
axes[0][1].plot(x, y) 
axes[1][2].plot(x, y) 

# save figure 
plt.savefig('image.png') 

Hinweis: Es ist zwingend notwendig squeeze zu False einzustellen.

Grundsätzlich möchte ich eine spärliche Figur. Einige Teilzeichnungen in Reihen können leer sein, sollten aber deaktiviert sein (keine Achsen müssen sichtbar sein). Vollständig leere Zeilen müssen entfernt werden und dürfen nicht auf unsichtbar gesetzt werden.

+0

Sie subplot2grid verwenden könnte? – DavidG

+0

Ich denke, es wäre möglich, aber wie löst es mein Problem, leere Subplots zu bestimmen? – hotsplots

+0

Siehe meine Antwort, um zu sehen, ob es für Ihr Problem gilt – DavidG

Antwort

4

Ein Weg zu erreichen, was Sie benötigen, ist die Verwendung von Matplotlibs subplot2grid Funktion. Mit diesem können Sie die Gesamtgröße des Rasters festlegen (in Ihrem Fall 3,7) und wählen, dass nur Daten in bestimmten Teilzeichnungen in diesem Raster gezeichnet werden sollen. Ich habe den Code unten angepasst, ein Beispiel zu geben:

enter image description here

EDIT:

import matplotlib.pyplot as plt 

x = [1,2] 
y = [3,4] 

fig = plt.subplots(squeeze=False) 
ax1 = plt.subplot2grid((3, 7), (0, 1)) 
ax2 = plt.subplot2grid((3, 7), (1, 2)) 

ax1.plot(x,y) 
ax2.plot(x,y) 

plt.show() 

Das folgende Diagramm gibt

Subplot2grid, in der Tat, Sie nicht geben ein Liste der Achsen. In Ihrer ursprünglichen Frage verwenden Sie fig, axes = plt.subplots(3, 7, squeeze=False) und dann verwenden Sie axes[0][1].plot(x, y), um festzulegen, in welchem ​​Teilplot Ihre Daten geplottet werden. Das ist dasselbe wie das, was subplot2grid tut, abgesehen davon zeigt es nur die Teilplots mit Daten in ihnen, die Sie definiert haben.

Also nehmen Sie ax1 = plt.subplot2grid((3, 7), (0, 1)) in meiner Antwort oben, hier habe ich die Form des 'Grid' angegeben, die 3 x 7 ist. Das bedeutet, dass ich 21 Teilplots in diesem Raster haben kann, wenn ich wollte, genau wie Sie ursprünglichen Code. Der Unterschied besteht darin, dass Ihr Code alle Unterplots anzeigt, während subplot2grid dies nicht tut. Die (3,7) in ax1 = ... oben spezifiziert die Form des gesamten Gitters und die (0,1) gibt an, wo in dieses Gitter das Nebenplot angezeigt wird.

Sie können den Subplot innerhalb des 3x7 Rasters beliebig positionieren. Sie können auch alle 21 Leerzeichen dieses Rasters mit Unterplots füllen, die Daten enthalten, wenn Sie möchten, indem Sie den ganzen Weg bis zu ax21 = plt.subplot2grid(...) gehen.

+0

Diese 'fig, axes = pltplots (3, 7, squeeze = False)' auch eine Liste von Achsen. Wie bekomme ich eine ähnliche Liste von Achsen mit 'subplot2grid'? – hotsplots

+0

Wenn Sie "Liste der Achsen" sagen, meinen Sie, dass Sie mit 'fig, axes = pltplots (3, 7, squeeze = False)' 'Achsen [0] [1] .plot (x, y) 'und wählen Sie, in welchem ​​Unterplot das Diagramm tatsächlich angezeigt wird? – DavidG

+0

Ich habe meine Antwort trotzdem aktualisiert, um zu versuchen, Ihren Kommentar zu beantworten (wenn ich ihn richtig verstanden habe). – DavidG

3

können Sie die fig.delaxes() Methode verwenden:

import matplotlib.pyplot as plt 

# create figure wit 3 rows and 7 cols; don't squeeze is it one list 
fig, axes = plt.subplots(3, 7, squeeze=False) 
x = [1,2] 
y = [3,4] 

# plot stuff only in two SubAxes; other axes are empty 
axes[0][1].plot(x, y) 
axes[1][2].plot(x, y) 

# delete empty axes 
for i in [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 
      18, 19, 20]: 
    fig.delaxes(axes.flatten()[i]) 

# save figure 
plt.savefig('image.png') 
plt.show(block=False) 
Verwandte Themen