2016-10-08 24 views
1

私は、symlog軸を使って極地のヒストグラムを作成する際に問題が発生しています。しかし、これは負のr値がある場合にのみ壊れます。これを修正するにはどうすればよいですか?matplotlibでは、極座標投影とsymlog r軸を使用して2Dヒストグラムを作成するにはどうすればよいですか?

5つのプロットを表示する最小限の例が含まれています。プロット4は機能しないものです(真ん中の行)プロット5は正の数で動作することを示します。ここで

は出力です:

enter image description here

ここでコードがあります:

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import cm 
from matplotlib.scale import SymmetricalLogTransform 


MIN_BINS = 500 
MAX_BINS = 1000 
# utility function for making bins of correct size 
def get_bins(min_val, max_val, scaling): 
    w = 1 + max(MIN_BINS, min(MAX_BINS, abs(min_val - max_val) + 1)) 

    if scaling == 'log': 
     return np.logspace(np.log10(min_val), np.log10(max_val), w) 
    elif scaling == 'symlog': 
     tr = SymmetricalLogTransform(base=10, linthresh=1, linscale=1) 

     ss = tr.transform([min_val, max_val]) 

     ls = tr.inverted().transform(np.linspace(*ss, num=w)) 
     return ls 
    else:# linear 
     return np.linspace(min_val, max_val, w) 




TESTS = [1,2,3,4,5] 

plt.figure(figsize=(12,18)) 
plot_pos = 320 
for TEST in TESTS: 
    plot_pos += 1 

    if TEST == 1: 
     NEG = True 
     YSCALE = 'linear' 
     PROJECTION = None 

    if TEST == 2: 
     NEG = True 
     YSCALE = 'symlog' 
     PROJECTION = None 


    if TEST == 3: 
     NEG = True 
     YSCALE = 'linear' 
     PROJECTION = 'polar' 

    # This is what I want to work 
    if TEST == 4: 
     NEG = True 
     YSCALE = 'symlog' 
     PROJECTION = 'polar' 

    # However, remove the negative numbers and it seems to work 
    if TEST == 5: 
     NEG = False 
     YSCALE = 'symlog' 
     PROJECTION = 'polar' 



    sample_size = 100000 
    xs = np.pi * np.linspace(0.0, 2.0, sample_size) 
    ys = 20 * np.random.random(sample_size) 

    if NEG: 
     ys -= 10 

    ax = plt.subplot(plot_pos, projection=PROJECTION) 

    ax.set_title('Neg/Scale/Proj.:%s,%s,%s' % (NEG, YSCALE, PROJECTION)) 

    min_y = np.min(ys) 
    max_y = np.max(ys) 
    min_x = np.min(xs) 
    max_x = np.max(xs) 

    x_bins = get_bins(min_x, max_x, 'linear') 
    y_bins = get_bins(min_y, max_y, YSCALE) 

    hist, xedges, yedges = np.histogram2d(
     xs, 
     ys, 
     bins=[x_bins, y_bins] 
    ) 

    X, Y = np.meshgrid(xedges, yedges) 

    ax.pcolormesh(
     X, Y, 
     hist.T, 
     cmap=cm.gray_r, 
    ) 

    if PROJECTION == 'polar': 
     ax.set_rscale(YSCALE) 

     ax.set_rmax(max_y) 
     ax.set_rmin(min_y) 
    else: 
     ax.set_ylim([min_y, max_y]) 

     ax.set_yscale(YSCALE) 

    ax.grid(True) 

plt.savefig('polar_example.png') 
+1

に放射状のケースを変更するとここにあなたのテストです。 com/questions/3305865/what-is-the-difference-between-log-and-symlog)を使用してください。彼らは非常に便利です。 – Annan

+0

ええ、申し訳ありませんが、私はコメントを残した後に気づいた:)午前2時以降スマートなおしゃれではありません...私はちょっとだけ私のコメントを削除しなかった;)申し訳ありません。 –

+0

@AndrasDeak問題はありません:)それはよくあることではありません。 – Annan

答えて

1

これはmatplotlibのバグかもしれないが、残念ながら極座標プロットは、複数のscaling issuesmight have to go through some major revisions in the futureを持っています。私はあなたの問題の第四polarため、問題はこれがあると思われる

からsymlog軸:symlogはそれらを処理する用意があるので、

>>> ax.get_rmin() 
-9.9998049982336408 

>>> ax.get_rmax() 
9.9999564676741315 

負の半径が存在しています。しかし、matplotlibはこれらの値をプロットするいくつかの問題がありました。corresponding behaviour even changed in the past。私は今、唯一の問題は、ax.set_rmin()への呼び出しの間に渡された負のラジアル制限が、正の値を反映していると解釈していることです。 // stackoverflowの:私は「symlog」規模が対称対数スケールの詳細については、[この質問](HTTPであるであるか疑問に思う人にとって

if PROJECTION == 'polar': 
    ax.set_rscale(YSCALE) 

    ax.set_rmax(max_y) 
    ax.set_rmin(max(0,min_y)) # change here 

fixed result

関連する問題