@ câu trả lời drevicko của thất bại cho tôi khi vẽ hai chuỗi sau điểm:
l1 = [0.03, -0.6, 1, 0.05]
l2 = [0.8, 0.9, 1, 1.1]
fig, ax1 = plt.subplots()
ax1.plot(l1)
ax2 = ax1.twinx()
ax2.plot(l2, color='r')
align_yaxis(ax1, 0, ax2, 0)
... vì vậy đây là phiên bản của tôi:
def align_yaxis(ax1, ax2):
"""Align zeros of the two axes, zooming them out by same ratio"""
axes = (ax1, ax2)
extrema = [ax.get_ylim() for ax in axes]
tops = [extr[1]/(extr[1] - extr[0]) for extr in extrema]
# Ensure that plots (intervals) are ordered bottom to top:
if tops[0] > tops[1]:
axes, extrema, tops = [list(reversed(l)) for l in (axes, extrema, tops)]
# How much would the plot overflow if we kept current zoom levels?
tot_span = tops[1] + 1 - tops[0]
b_new_t = extrema[0][0] + tot_span * (extrema[0][1] - extrema[0][0])
t_new_b = extrema[1][1] - tot_span * (extrema[1][1] - extrema[1][0])
axes[0].set_ylim(extrema[0][0], b_new_t)
axes[1].set_ylim(t_new_b, extrema[1][1])
Có về nguyên tắc vô hạn khác nhau khả năng sắp xếp các số không (hoặc các giá trị khác, mà các giải pháp được cung cấp khác chấp nhận): bất cứ nơi nào bạn đặt 0 trên trục y, bạn có thể thu phóng từng chuỗi trong số hai chuỗi sao cho phù hợp. Chúng tôi chỉ chọn vị trí như vậy, sau khi chuyển đổi, hai bao gồm một khoảng thời gian theo chiều dọc cùng chiều cao. Hoặc nói cách khác, chúng tôi giảm thiểu chúng cùng một yếu tố so với âm mưu không liên kết. (Điều này không không có nghĩa là 0 là một nửa của cốt truyện: điều này sẽ xảy ra ví dụ như nếu một cốt truyện là tất cả tiêu cực và khác đều tích cực.)
NumPy phiên bản:
def align_yaxis_np(ax1, ax2):
"""Align zeros of the two axes, zooming them out by same ratio"""
axes = np.array([ax1, ax2])
extrema = np.array([ax.get_ylim() for ax in axes])
tops = extrema[:,1]/(extrema[:,1] - extrema[:,0])
# Ensure that plots (intervals) are ordered bottom to top:
if tops[0] > tops[1]:
axes, extrema, tops = [a[::-1] for a in (axes, extrema, tops)]
# How much would the plot overflow if we kept current zoom levels?
tot_span = tops[1] + 1 - tops[0]
extrema[0,1] = extrema[0,0] + tot_span * (extrema[0,1] - extrema[0,0])
extrema[1,0] = extrema[1,1] + tot_span * (extrema[1,0] - extrema[1,1])
[axes[i].set_ylim(*extrema[i]) for i in range(2)]