4

同じカラーバーを共有し、正と負の値を持ち、対数スケールで、いくつかの配列のプロットのグリッドを生成したいと考えています。

カラーバーの共有部分 (ImageGrid と共通の最大値と最小値を使用) を達成しました。正の値のみの場合、 imshow 呼び出しで LogNorm() を使用して対数スケールを取得できることを知っています。しかし、負の値が存在する場合、対称対数スケールのカラーバーが必要になります。

https://stackoverflow.com/a/7741317/1101750で解決策を見つけましたが、Yann が提供するサンプル コードを実行すると、明らかに間違った非常に異なる結果が得られます。 ヤンの例の結果 コードを確認すると、把握できませんどうしたの。

それに加えて、Matplotlib 1.2 では、scale.SymmetricalLogScale.SymmetricalLogTransform がドキュメントで説明されていない新しい引数を要求することを発見しました (linscale、他の変換のコードを見て、1 のままにしておくのは安全だと思います)。価値)。

最も簡単なソリューションは LogNorm をサブクラス化することですか?

4

2 に答える 2

4

サブクラス化を行う必要なく、これを正確に行うために過去に非常に単純なレシピを使用しました。matplotlib.colors.SymLogNorm は、目盛りを手動で生成する必要があることを除いて、必要な機能のほとんどを提供します。このソリューションは matplotlib 1.3.0 を使用しており、1.2 では利用できなかった機能を使用している可能性があることに注意してください。

def imshow_symlog(my_matrix, vmin, vmax, logthresh=5):
    img=imshow( my_matrix ,
                vmin=float(vmin), vmax=float(vmax),
                norm=matplotlib.colors.SymLogNorm(10**-logthresh) )

    maxlog=int(np.ceil( np.log10(vmax) ))
    minlog=int(np.ceil( np.log10(-vmin) ))

    #generate logarithmic ticks 
    tick_locations=([-(10**x) for x in xrange(minlog,-logthresh-1,-1)]
                    +[0.0]
                    +[(10**x) for x in xrange(-logthresh,maxlog+1)] )

    cb=colorbar(ticks=tick_locations)
    return img,cb
于 2014-04-16T19:38:46.183 に答える
-1

1.3 以降、matplotlib には SymLogNorm があります。http://matplotlib.org/api/colors_api.html#matplotlib.colors.SymLogNorm

于 2014-04-16T19:43:38.173 に答える