Как разделить ось x двух подзаголовков после их создания?

97

Я пытаюсь разделить две оси подзаголовков, но мне нужно поделиться осью x после создания фигуры. Так, например, я создаю такую ​​фигуру:

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

Вместо комментария я бы вставил код для разделения обеих осей x. Я не нашел ни малейшего понятия, как я могу это сделать. Есть некоторые атрибуты, _shared_x_axesи _shared_x_axesкогда я проверяю фигуру axis ( fig.get_axes()), я не знаю, как их связать.

ymmx
источник

Ответы:

137

Обычный способ совместного использования осей - это создание общих свойств при создании. Либо

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()
ВажностьБытия Эрнеста
источник
Кстати, странная причина в том, что я сохранил некоторую фигуру с помощью pickle и перезагружаю ее с помощью другой программы, которая теряет свойство 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
3
@ naught101 Ты можешь просто позвонить ax2.autoscale().
ImportanceOfBeingErnest