2017-09-19 3 views
0

x- 값이 큰 데이터를 포함하는 일부 데이터에 대해 KDE를 플롯하려고합니다. 따라서 x 축에 로그 스케일을 사용하고 싶습니다. 음모를 꾸미기 위해 나는 시보 른과 Plotting 2D Kernel Density Estimation with Python의 해답을 사용했습니다. 일단 xscale을 대수로 설정하면 실패합니다. 내 x- 데이터의 로그를 미리 취하면 틱과 ticlabels이 라벨과 같은 실제 값의 로그와 선형 적이라는 것을 제외하고는 모든 것이 잘 보입니다. 나는 수동으로 같은 것을 사용하여 틱을 변경할 수 있습니다 : Matplotlib의 대수 x- 데이터로 KDE 플로팅

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) 

하지만 난 그냥 사용합니다 (마이너 틱 포함) 축 레이블에 가까운 것도 그냥 잘못 보이는 않고 내 눈에

ax.set_xscale('log') 

대수 x- 데이터로 KDE를 플롯하는 쉬운 방법이 있습니까? 또는 데이터 스케일링을 변경하지 않고도 틱 또는 라벨 스케일을 변경하여 x의 로그 값을 플롯하고 이후에 라벨의 스케일을 변경할 수 있습니까?

편집 : 이 같은 모습을 만들려면 줄거리 : Desired plots 두 바로 열이 같이하도록되어 무엇인가. 여기서 로그를 이미 적용한 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의 대역폭과 관련이 있다고 생각합니다. 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