2013-02-13 39 views
5

Tôi đang cố vẽ một hình có hai trục x, không tuyến tính với nhau, với matplotlib. Cốt truyện tôi muốn nhận được là như thế này:Nhiều trục x, phi tuyến tính với nhau

Plot

Về cơ bản, độ tuổi phụ thuộc vào sự thay đổi màu đỏ. Nó không tuyến tính và cần được tính toán. Tôi muốn thực hiện cả độ tuổi và sự dịch chuyển màu đỏ dưới dạng trục x. Làm thế nào tôi có thể làm cho nó?

Trả lời

3

Chức năng twiny() có thể là những gì bạn đang tìm kiếm.

import matplotlib.pyplot as plt 
plt.loglog(range(100)) 
ax1 = plt.gca() 
ax2 = ax1.twiny() 
ax2.set_xticks([100,80,50]) 
ax2.set_xticklabels(['0','1','2']) 
ax1.set_xlabel('redshift') 
ax2.set_xlabel('age') 
plt.show() 

example plot for twiny() function

+0

Tôi đã làm, nhưng không thể đăng bài vì tôi thiếu danh tiếng. –

+0

Tôi đã không nhận được điểm của chức năng này. Dường như hai trục x vẫn tuyến tính với nhau. – Fxyang

+1

Tôi đoán tôi giả định bởi phi tuyến tính bạn có nghĩa là lôgarit. xticks sẽ đặt dấu tùy ý, xticklabels có thể gắn nhãn chúng. Hy vọng rằng sẽ giúp. –

0

Tôi đã làm điều này như thế này:

from mpl_toolkits.axes_grid.parasite_axes import SubplotHost 
fig = plt.figure(1, figsize=(figwidth,figheight)) 
ax = SubplotHost(fig, 1,1,1) 
fig.add_subplot(ax) 

#plotting as usual 

ax2 = ax.twin() # ax2 is responsible for "top" axis and "right" axis 
ax2.axis["right"].toggle(ticklabels=False) 
ax2.xaxis.set_major_formatter(FuncFormatter(fmt_zToEta)) #set eta coord format 

#with a function for the Z to eta transform for plot labels 
def fmt_zToEta(x, pos=None): 
    #... 
    return transformed_label 

Tôi cũng nhớ bắt đầu với dịch chuyển đỏ mà dụ ;-)

Tôi nghĩ rằng điều SubPlotHost là cần thiết, nhưng Tôi không chắc chắn 100%, kể từ khi tôi tách nó ra khỏi một cốt truyện hiện có (phụ) của tôi mà không kiểm tra xem nó có chạy độc đáo không.

Chỉnh sửa: cũng có, xem https://stackoverflow.com/a/10517481/599884

Các vấn đề liên quan