파이썬에서 대화 형 PCA 산점도를 만들려면 어떻게해야합니까?


11

하기 matplotlib의 라이브러리는 특히 Jupyter 노트북 내부에 매우 능력이 있지만, 상호 교환 성이 부족하다. plot.ly 와 같은 좋은 오프라인 플로팅 도구를 원합니다 .


3
나는 그런 것들에 정통하지 않기 때문에 실제로 좋은 대답을 쓸 수는 없지만 github.com/ipython/ipywidgets/blob/master/docs/source/examples의ipywidgets 예제를 볼 수 있습니다. /… ) 또는 bokeh( bokeh.pydata.org/en/latest ).
Torbjørn T.

답변:


10

대화식 D3 플롯을 생성하는 MPLD3 라는 멋진 라이브러리가 있습니다 .

이 코드는 Jupyter Notebook과 호환되는 널리 사용되는 홍채 데이터 세트의 HTML 대화식 플롯을 생성합니다. 페인트 브러시를 선택하면 모든 플롯 중에서 강조 표시 할 데이터 하위 집합을 선택할 수 있습니다. 십자형 화살표를 선택하면 데이터 포인트 위로 마우스를 가져 가고 원래 데이터에 대한 정보를 볼 수 있습니다. 이 기능은 탐색 적 데이터 분석을 수행 할 때 매우 유용합니다.

matplotlib.pyplot을 plt로 가져 오기
numpy를 np로 가져 오기
팬더를 pd로 가져 오기
SB로 seaborn 가져 오기
mpld3 가져 오기
mpld3 가져 오기 플러그인에서
% matplotlib 인라인

홍채 = sb.load_dataset ( 'iris')
sklearn.preprocessing 가져 오기 StandardScaler에서
X = pd.get_dummies (아이리스)
X_scal = 표준 스케일러 () .fit_transform (X)

희미한 = 3
sklearn.decomposition 수입 PCA에서
pca = PCA (n_components = 희미 함)
Y_sklearn = pca.fit_transform (X_scal)

# 사용자 정의 레이블을 제어하기 위해 CSS를 정의하십시오.
css = "" "
표
{
  국경 붕괴 : 붕괴;
}
일
{
  색상 : #ffffff;
  배경색 : # 000000;
}
td
{
  배경색 : #cccccc;
}
테이블, 일, td
{
  폰트-패밀리 : Arial, Helvetica, sans-serif;
  테두리 : 1px 검은 색;
  텍스트 정렬 : 오른쪽;
}
"" "

무화과, 도끼 = plt. subplots (dim, dim, figsize = (6,6))
그림 subplots_adjust (hspace = .4, wspace = .4)
툴팁 = [없음] * dim

N = 200
인덱스 = np.random.choice (range (Y_sklearn.shape [0]), size = N)

m 범위 내 (dim) :
    범위 (m + 1)의 n의 경우 :
        ax [m, n] .grid (참, 알파 = 0.3)
        산란 = ax [m, n] .scatter (Y_sklearn [index, m], Y_sklearn [index, n], alpha = .05)

        라벨 = []
        색인에서 i의 경우 :
            레이블 = X.ix [[i], :]. T.astype (int)
            label.columns = [ '행 {0}'. format (X.index [i])]
            labels.append (str (label.to_html ()))

        ax [m, n] .set_xlabel ( 'Component'+ str (m))
        ax [m, n] .set_ylabel ( 'Component'+ str (n))
        #ax [m, n] .set_title ( 'HTML 툴팁', 크기 = 20)

        tooltip [m] = 플러그인 .PointHTMLTooltip (scatter, labels,
                                           voffset = 20, hoffset = 20, css = css)
        plugins.connect (그림, 툴팁 [m])

plugins.connect (그림, plugins.LinkedBrush (scatter))
테스트 = mpld3.fig_to_html (fig = fig)

text_file로 open ( "Output.html", "w") 사용 :
    text_file.write (test)

내 블로그에서 실제로 볼 수 있습니다 .

[2016 년 7 월 9 일] 업데이트 : Plot.ly에 오프라인 모드가 있으며 이제는 오픈 소스임을 알게되었습니다. 그것은 많은 종소리와 휘파람이 사전 포장되어 있지만 MPLD3은 여전히 ​​적절한 경우가 있습니다.


3

내 의도는 플러그 / 광고하지 않는 것이기 때문에 대답 대신 주석으로 사용하고 싶지만 현재 원하는대로 수행 할 때 관심이있을 수있는 논문을 작성 중입니다. 실제로는 클러스터링 시각화 도구이지만 k = 1 인 k- 평균을 사용하는 경우 용어를 검색하고 영역을 선택하며 각 노드의 내용 및 기타 항목을 볼 수있는 대화식 그림이 있습니다. 살펴보고 그것이 당신을 위해 작동하는지 확인하십시오!

https://github.com/Lilykos/clusterix


멋있는! 내가 볼게
scottlittle

0

아주 좋은 선택은, 음모는 ...

필자의 경우, 기술이 300 차원의 word2vec 포함 인 기술을 기반으로 유사한 지정을 작성하려고했습니다. 그것을 3 차원 벡터 공간으로 가져 왔고, 플롯 Scatter3D를 사용하여 3D 산점도를 그릴 수있었습니다.

Et Viola !! 호버 및 확대 기능으로 멋진 3 차원 그래프를 얻습니다. 그리고 가장 중요한 부분은 html 파일로 내 보내서 다른 PC에 적합한 플러그 앤 플레이로 만들 수 있으며 브라우저에서 끌어서 놓기 만하면됩니다 (아래 코드에 포함되어 있음).

더 이상 무엇이든 더 간단하게 할 수 있습니까?

from plotly.offline import plot
from plotly.graph_objs import *
import numpy as np

# x = np.random.randn(2000)
# y = np.random.randn(2000)

# Instead of simply calling plot(...), store your plot as a variable and pass it to displayHTML().
# Make sure to specify output_type='div' as a keyword argument.
# (Note that if you call displayHTML() multiple times in the same cell, only the last will take effect.)

p = plot(
  [
    Scatter3d(x=skills_df[0], y=skills_df[1], z=skills_df[2], text= skills_df['designation'], mode='markers', marker=Marker(color=skills_df['cluster_number'], size=3, opacity=0.5, colorscale='Viridis'))
  ],
  output_type='div'
#   filename='/dbfs/FileStore/tables/lnkdn_jobroles_viridis.html' turn it on to save the file
)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.