Як поділити вісь x двох підпрограм після їх створення?


97

Я намагаюся поділити дві осі додаткових графіків, але мені потрібно поділити вісь х після створення фігури. Так, наприклад, я створюю цю фігуру:

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

Замість коментаря я б вставив якийсь код, щоб поділити обидві осі х. Я не знайшов жодної підказки, як я можу це зробити. Є деякі атрибути, _shared_x_axesі _shared_x_axesколи я перевіряю, щоб зобразити вісь ( fig.get_axes()), але я не знаю, як їх зв’язати.

Відповіді:


139

Звичайний спосіб спільного використання осей - це створення спільних властивостей при створенні. Або

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

або

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

Тому спільне використання осей після їх створення не повинно бути необхідним.

Однак якщо з будь-якої причини вам потрібно надати спільний доступ до осей після їх створення (насправді, використовуючи іншу бібліотеку, яка створює деякі підпрограми, як тут , або спільний доступ до осей вставки може бути причиною), рішення все одно буде:

Використовуючи

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

створює зв'язок між двома осями, ax1і ax2. На відміну від спільного доступу під час створення, вам доведеться вручну вимкнути xticklabels для однієї з осей (у випадку, якщо це потрібно).

Повний приклад:

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

До речі, дивна причина полягає в тому, що я врятував якусь фігуру засоленням і перезавантажую їх іншою програмою, яка втрачає властивість sharex.
ymmx

4
Це корисно для підключення вибраних підпрограм. Наприклад, фігура з 4 підрозділами: два часові ряди та дві гістограми. Це дозволяє вибірково пов'язувати часові ряди.
Хамід

2
Документи API для об’єкта Grouper: matplotlib.org/2.0.2/api/…
michaelosthege

3
Ох, я щойно придумав, як зняти спільний доступ до осі (що може бути корисним у великій сітці) - на цій осі зробіть g = ax.get_shared_y_axes(); g.remove(a) for a in g.get_siblings(ax)]. Дякую за вихідну точку!
naught101 02.03.18

3
@ naught101 Ви можете просто зателефонувати ax2.autoscale().
ImportanceOfBeingErnest
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.