2017-09-19 18 views
0

x値の大きな範囲をカバーするデータを持つデータの一部をKDEでプロットするとします。したがって、私はx軸に対数スケールを使用したいと思います。プロッティングのために私はseabornとPlotting 2D Kernel Density Estimation with Pythonからの解決法を使用していました。どちらも一度xscaleを対数に設定すると失敗します。私がx-データの対数をあらかじめ取っておけば、ティックとチクラベルは線形であり、実際の値の対数はラベルであるという点を除いて、すべてが上手く見えます。私はちょうどMatplotlibの対数xデータでKDEをプロットする

ax.set_xscale('log') 
を使用するときだけ間違って検索し、(小目盛りを含む)軸ラベルに近いものではありません

labels = np.array(ax.get_xticks().tolist(), dtype=np.float64) 
new_labels = [r'$10^{%.1f}$' % (labels[i]) for i in range(len(labels))] 
ax.set_xticklabels(new_labels) 

が、私の目には:私は手動でのようなものを使用して目盛りを変更することができます

対数型のx-データを使ってKDEをプロットする簡単な方法はありますか?あるいは、データのスケーリングを変更せずにチックまたはラベルスケールを変更するだけで、xの対数値をプロットし、後でラベルのスケーリングを変更することができますか?

編集:私はこのようなルックスを作成したい プロット: Desired plots 2つの右の列は、見えるようになっているものです。ここでは、すでに適用されている対数を使ってxデータを使用しました。私はx軸のラベルが好きではありません。

左の列はプロットを表示し、元のデータは、KDEや他のすべてのプロットに使用され、その後、スケールが何らかの理由でKDEを

ax.set_xscale('log') 

を使用して変更されたときに、似ていませんそれは見ることになっています。これはまた、対数データが​​使用されている場合には正常に見えるので、誤ったデータの結果でもありません。

編集2: コードの実施例は、ax[1]プロットは私(X軸が反転される)のために正しく表示されない

import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 

data = np.random.multivariate_normal((0, 0), [[0.8, 0.05], [0.05, 0.7]], 100) 
x = np.power(10, data[:, 0]) 
y = data[:, 1] 
fig, ax = plt.subplots(2, 1) 
sns.kdeplot(data=np.log10(x), data2=y, ax=ax[0]) 
sns.kdeplot(data=x, data2=y, ax=ax[1]) 
ax[1].set_xscale('log') 
plt.show() 

であるが、一般的な挙動は場合と同じです上述した。私はこの問題がkdeの帯域幅にあると考えています。これはおそらく対数的なx-データを説明するはずです。

+0

を使用することができます。 'ax.set_xscale( 'log')'のようなものが動作するはずなので、ログスケールでKDEをプロットするという問題はありません。 – ImportanceOfBeingErnest

+0

問題を再現するために、いくつかのデータサンプルを提供できますか? – Grigoriy

+0

私はいくつかのさらなる説明を追加し、再現のためにいくつかのサンプルデータを用意します。 –

答えて

0

私にはうってつけの答えがあり、他の人にも同様の問題がある場合に備えて投稿したいと思っていました。 thisの回答から、最初に対数をxデータに適用し、KDEを実行した後にx値を元の値に戻す関数を定義しました。その後、私は単純に等高線をプロットし、私はあなたが明確に実際の問題を述べることを忘れてしまったと思いますax.set_xscale('log')

def logx_kde(x, y, xmin, xmax, ymin, ymax): 
    x = np.log10(x) 

    # Peform the kernel density estimate 
    xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j] 
    positions = np.vstack([xx.ravel(), yy.ravel()]) 
    values = np.vstack([x, y]) 
    kernel = st.gaussian_kde(values) 
    f = np.reshape(kernel(positions).T, xx.shape) 
    return np.power(10, xx), yy, f 
関連する問題