Làm thế nào để chia sẻ trục x của hai ô con sau khi chúng được tạo?


96

Tôi đang cố gắng chia sẻ hai trục biểu đồ con, nhưng tôi cần chia sẻ trục x sau khi hình được tạo. Vì vậy, ví dụ, tôi tạo hình này:

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

Thay vì nhận xét, tôi sẽ chèn một số mã để chia sẻ cả hai trục x. Tôi không tìm thấy bất kỳ manh mối nào làm thế nào tôi có thể làm điều đó. Có một số thuộc tính _shared_x_axes_shared_x_axeskhi tôi kiểm tra với trục hình ( fig.get_axes()) nhưng tôi không biết cách liên kết chúng.

Câu trả lời:


137

Cách thông thường để chia sẻ các trục là tạo các thuộc tính được chia sẻ khi tạo. Hoặc

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

hoặc là

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

Do đó, không cần chia sẻ các trục sau khi chúng đã được tạo ra.

Tuy nhiên, nếu vì bất kỳ lý do gì, bạn cần chia sẻ các trục sau khi chúng đã được tạo (thực tế, sử dụng một thư viện khác tạo ra một số khe phụ, như ở đây hoặc chia sẻ các trục nội bộ có thể là một lý do), vẫn sẽ có một giải pháp:

Sử dụng

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

tạo liên kết giữa hai trục ax1ax2. Ngược lại với việc chia sẻ tại thời điểm tạo, bạn sẽ phải tắt các xticklabels theo cách thủ công cho một trong các trục (trong trường hợp muốn).

Một ví dụ hoàn chỉnh:

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

Nhân tiện, lý do kỳ lạ là tôi đã lưu một số figure bằng pickle và tôi tải lại chúng bằng một chương trình khác làm mất thuộc tính sharex.
ymmx 23/03/17

4
Điều này rất hữu ích để kết nối các vùng phụ được chọn. Ví dụ, một hình có 4 biểu đồ con: hai chuỗi thời gian và hai biểu đồ. Điều này cho phép bạn liên kết có chọn lọc chuỗi thời gian.
Hamid

2
Tài liệu API cho Grouper đối tượng: matplotlib.org/2.0.2/api/...
michaelosthege

3
Ồ, tôi vừa mới tìm ra cách để chia sẻ một trục (có thể hữu ích trong một lưới lớn) - trên trục đó, làm g = ax.get_shared_y_axes(); g.remove(a) for a in g.get_siblings(ax)]. Cảm ơn vì điểm bắt đầu!
naught101

3
@ naught101 Bạn chỉ có thể gọi ax2.autoscale().
Tầm quan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.