Wie kann die x-Achse von zwei Unterplots geteilt werden, nachdem sie erstellt wurden?


89

Ich versuche, zwei Nebenplotachsen zu teilen, aber ich muss die x-Achse teilen, nachdem die Figur erstellt wurde. So erstelle ich zum Beispiel diese Figur:

import numpy as np
import matplotlib.pyplot as plt

t= np.arange(1000)/100.
x = np.sin(2*np.pi*10*t)
y = np.cos(2*np.pi*10*t)

fig=plt.figure()
ax1 = plt.subplot(211)
plt.plot(t,x)
ax2 = plt.subplot(212)
plt.plot(t,y)

# some code to share both x axis

plt.show()

Anstelle des Kommentars würde ich einen Code einfügen, um beide x-Achsen gemeinsam zu nutzen. Ich habe keine Ahnung gefunden, wie ich das machen kann. Es gibt einige Attribute _shared_x_axesund _shared_x_axeswenn ich zur Abbildung Achse ( fig.get_axes()) überprüfe, weiß ich nicht, wie ich sie verknüpfen soll.

Antworten:


128

Die übliche Methode zum Freigeben von Achsen besteht darin, die freigegebenen Eigenschaften bei der Erstellung zu erstellen. Entweder

fig=plt.figure()
ax1 = plt.subplot(211)
ax2 = plt.subplot(212, sharex = ax1)

oder

fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)

Das Teilen der Achsen nach ihrer Erstellung sollte daher nicht erforderlich sein.

Wenn Sie jedoch aus irgendeinem Grund Achsen freigeben müssen, nachdem sie erstellt wurden (tatsächlich kann die Verwendung einer anderen Bibliothek, die einige Unterzeichnungen erstellt, wie hier , oder die Freigabe einer eingefügten Achse ein Grund sein), gibt es dennoch eine Lösung:

Verwenden von

ax1.get_shared_x_axes().join(ax1, ax2)

erstellt eine Verbindung zwischen den beiden Achsen ax1und ax2. Im Gegensatz zur Freigabe zur Erstellungszeit müssen Sie die xticklabels für eine der Achsen manuell deaktivieren (falls dies gewünscht wird).

Ein vollständiges Beispiel:

import numpy as np
import matplotlib.pyplot as plt

t= np.arange(1000)/100.
x = np.sin(2*np.pi*10*t)
y = np.cos(2*np.pi*10*t)

fig=plt.figure()
ax1 = plt.subplot(211)
ax2 = plt.subplot(212)

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

ax1.get_shared_x_axes().join(ax1, ax2)
ax1.set_xticklabels([])
# ax2.autoscale() ## call autoscale if needed

plt.show()

Der seltsame Grund ist übrigens, dass ich eine Figur mit pickle gespeichert und sie mit einem anderen Programm neu geladen habe, das die sharex-Eigenschaft verliert.
Ymmx

4
Dies ist nützlich, um ausgewählte Untergrundstücke zu verbinden. Zum Beispiel eine Figur mit 4 Unterplots: zwei Zeitreihen und zwei Histogramme. Auf diese Weise können Sie die Zeitreihen selektiv verknüpfen.
Hamid

2
API-Dokumente für das Grouper-Objekt: matplotlib.org/2.0.2/api/…
michaelosthege

2
Ohh, ich habe gerade herausgefunden, wie man die Freigabe einer Achse aufhebt (was in einem großen Raster nützlich sein kann) - auf dieser Achse g = ax.get_shared_y_axes(); g.remove(a) for a in g.get_siblings(ax)]. Danke für den Ausgangspunkt!
naught101

3
@ naught101 Du kannst einfach anrufen ax2.autoscale().
Wichtigkeit von
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.