Bagaimana berbagi sumbu x dari dua subplot setelah dibuat?

97

Saya mencoba membagikan dua sumbu subplot, tetapi saya perlu membagikan sumbu x setelah gambar dibuat. Jadi, misalnya, saya membuat gambar ini:

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

Alih-alih komentar saya akan memasukkan beberapa kode untuk berbagi kedua sumbu x. Saya tidak menemukan petunjuk bagaimana saya bisa melakukan itu. Ada beberapa atribut _shared_x_axesdan _shared_x_axesketika saya memeriksa ke figure axis ( fig.get_axes()) tetapi saya tidak tahu bagaimana menghubungkannya.

ymmx
sumber

Jawaban:

138

Cara biasa untuk berbagi sumbu adalah dengan membuat properti bersama saat pembuatan. Antara

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

atau

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

Oleh karena itu, berbagi sumbu setelah mereka dibuat seharusnya tidak diperlukan.

Namun jika karena alasan apa pun, Anda perlu berbagi sumbu setelah dibuat (sebenarnya, menggunakan pustaka berbeda yang membuat beberapa subplot, seperti di sini , atau berbagi sumbu inset mungkin menjadi alasannya), masih ada solusi:

Menggunakan

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

membuat hubungan antara dua sumbu, ax1dan ax2. Berbeda dengan berbagi pada saat pembuatan, Anda harus menyetel xticklabels secara manual untuk salah satu sumbu (jika itu diinginkan).

Contoh lengkapnya:

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()
ImportanceOfBeingErnest
sumber
Ngomong-ngomong, alasan anehnya adalah saya menyimpan beberapa gambar dengan acar dan saya memuatnya kembali dengan program lain yang kehilangan properti sharex.
ymmx
4
Ini berguna untuk menghubungkan subplot yang dipilih. Misalnya, gambar dengan 4 subplot: dua deret waktu dan dua histogram. Ini memungkinkan Anda untuk menautkan deret waktu secara selektif.
Hamid
2
Dokumen API untuk objek Kerapu: matplotlib.org/2.0.2/api/…
michaelosthege
3
Ohh, saya baru saja menemukan cara untuk membatalkan berbagi sumbu (yang dapat berguna dalam kotak besar) - pada sumbu itu, lakukan g = ax.get_shared_y_axes(); g.remove(a) for a in g.get_siblings(ax)]. Terima kasih untuk titik awalnya!
naught101
3
@ naught101 Anda bisa menelepon ax2.autoscale().
ImportanceOfBeingErnest