2013-02-13 12 views
5

Próbuję wykreślić postać z dwiema osiami x, które są nieliniowe względem siebie, z matplotlib. Działka chcę dostać to tak:Wiele osi X, które są nieliniowe dla siebie

Plot

Zasadniczo, wiek zależy od przesunięcia ku czerwieni. Jest nieliniowy i należy go obliczyć. Chcę ustawić wiek i przesunięcie czerwieni jako oś X. Jak mogę to zrobić?

Odpowiedz

3

Funkcja twiny() może być tym, czego szukasz.

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

zrobiłem, ale nie był w stanie odpowiedzieć na działkę jak brakuje mi reputację. –

+0

Nie widziałem sensu tej funkcji. Wydaje się, że dwie osie x są nadal liniowe względem siebie. – Fxyang

+1

Chyba założyłem, że nieliniowo oznacza logarytmiczny. xticks umieści dowolne tiki, xticklabels może je oznaczyć. Nadzieja, która pomaga. –

0

Zrobiłem to tak:

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 

Pamiętam też ruszania z tego przykładu przesunięcia ku czerwieni ;-)

Myślę SubPlotHost rzeczą jest to konieczne, ale Nie jestem w 100% pewny, odkąd wyrwałem to z istniejącej (pod) działki bez sprawdzenia, czy działa ona ładnie bez.

Edycja: również zobaczyć https://stackoverflow.com/a/10517481/599884

Powiązane problemy