2017-07-21 4 views
0

この例は、具体的には、log(redshift + 1)の関数としてデータをプロットすることに関連し、参照赤色シフト軸を有するが、任意の機能修正に容易に一般化することができる。修正された軸に意味のある小目盛りを追加しますか?

私は、ログ(1 +赤色シフト)プロットの上に赤色シフト軸を簡単に追加することができるきれいな小さな関数(ここではいくつかの質問/回答の助けを借りて)を書いています。私はです。は意味のある小さなダニを得るのに苦労しています。ここで

がプロット例を含むコード、次のとおりです。この場合、

が、私は、関数呼び出しでその0.1の変更の柔軟性と、大目盛りで占められていないすべての0.1刻みで赤方偏移をしたいと思います。

import matplotlib.pyplot as plt 
import numpy as np 

def add_zaxis(axis,denomination): 
    oldx = axis.get_xlim() 
    axis.set_xlim(0., None) 
    zspan = [(10**x)-1 for x in axis.get_xlim()] 

    denom = denomination 
    zmax = int(np.floor(zspan[1]/denom))*denom 
    zspan[1] = zmax 

    k = len(np.arange(zspan[0],zspan[1],denom))+1 
    zs = np.linspace(zspan[0],zspan[1],k) 
    z_ticks = [np.log10(1+x) for x in zs] 

    axz = axis.twiny() 
    axz.set_xticks(z_ticks) 
    axz.set_xticklabels(['{:g}'.format(y) for y in zs]) 

    axz.set_xlim(oldx) 
    axis.set_xlim(oldx) 
    return axz 


data = np.random.randn(500) 
data = data[data>0.] 

fig, ax = plt.subplots(1) 
plt.hist(np.log10(data+1), bins=22) 
ax.set_xlabel('log(z+1)') 
ax.minorticks_on() 

axz = add_zaxis(ax,.3) 
axz.set_xlabel('z') 
axz.minorticks_on() 

example plot

+0

あなたが期待される出力の例の画像を提供してもらえますか? – DavidG

答えて

1

アイデアは、軸上の目盛りを配置するFixedLocatorを使用することです。その後、メジャーダンプの場合はFixedLocator、マイナーダニの場合は1つを持つことができます。

import matplotlib.pyplot as plt 
import matplotlib.ticker 
import numpy as np 

def add_zaxis(ax,d=0.3, dminor=0.1): 
    f = lambda x: np.log10(x+1) 
    invf = lambda x: 10.0**x - 1. 

    xlim = ax.get_xlim() 
    zlim = [invf(x) for x in xlim] 
    axz = ax.twiny() 
    axz.set_xlim(xlim) 

    zs = np.arange(0,zlim[1],d) 
    zpos = f(zs) 
    axz.xaxis.set_major_locator(matplotlib.ticker.FixedLocator(zpos)) 
    axz.xaxis.set_major_formatter(matplotlib.ticker.FixedFormatter(zs)) 

    zsminor = np.arange(0,zlim[1],dminor) 
    zposminor = f(zsminor) 

    axz.xaxis.set_minor_locator(matplotlib.ticker.FixedLocator(zposminor)) 
    axz.tick_params(axis='x',which='minor',bottom='off', top="on") 
    axz.set_xlabel('z') 


data = np.random.randn(400) 
data = data[data>0.] 

fig, ax = plt.subplots(1) 
plt.hist(np.log10(data+1), bins=22) 
ax.set_xlabel('log(z+1)') 

add_zaxis(ax) 

ax.minorticks_on() 
ax.tick_params(axis='x',which='minor',bottom='on', top="off") 

plt.show() 

enter image description here

+0

いつものように、完璧な仕事@ImportanceOfBeingErnest。 私は実際にあなたの変更(例えば、 'fとinvf'など)のような任意の関数を渡すバージョンを持っています。あなたのバージョンはより簡潔です。 私は助けに感謝:) – FriskyGrub

関連する問題