PythonでインタラクティブなPCA散布図を作成するにはどうすればよいですか?


11

matplotlibののライブラリは非常に可能であるが、特にJupyterノートブック内で、インタラクティブに欠けています。plot.lyのような優れたオフラインプロットツールが欲しいのですが。


3
私はそのような事柄にあまり精通していないので、私は本当に良い答えを書くことはできませんが、あなたは見ることができますipywidgetsgithub.com/ipython/ipywidgets/blob/master/docs/source/examplesの/…)またはbokehbokeh.pydata.org/en/latest)。
–TorbjørnT. 2016

回答:


10

インタラクティブなD3プロットを生成するMPLD3と呼ばれる素晴らしいライブラリがあります。

このコードは、Jupyter Notebookと互換性のある人気のあるirisデータセットのHTMLインタラクティブプロットを生成します。ペイントブラシを選択すると、すべてのプロットで強調表示するデータのサブセットを選択できます。十字矢印を選択すると、データポイントにマウスを合わせて、元のデータに関する情報を表示できます。この機能は、探索的データ分析を行うときに非常に役立ちます。

matplotlib.pyplotをpltとしてインポートする
npとしてnumpyをインポートする
パンダをpdとしてインポート
シーボーンをsbとしてインポート
mpld3のインポート
mpld3インポートプラグインから
%matplotlibインライン

アイリス= sb.load_dataset( 'iris')
sklearn.preprocessingからインポートStandardScaler
X = pd.get_dummies(iris)
X_scal = StandardScaler()。fit_transform(X)

薄暗い= 3
sklearn.decompositionからインポートPCA
pca = PCA(n_components = dim)
Y_sklearn = pca.fit_transform(X_scal)

#カスタムラベルを制御するCSSを定義します
css = "" "
テーブル
{
  border-collapse:折りたたみ。
}
番目
{
  色:#ffffff;
  背景色:#000000;
}
td
{
  background-color:#cccccc;
}
table、th、td
{
  font-family:Arial、Helvetica、sans-serif;
  ボーダー:1ピクセルの黒一色。
  text-align:右;
}
「」

イチジク、ax = plt.subplots(dim、dim、figsize =(6,6))
fig.subplots_adjust(hspace = .4、wspace = .4)
tooltip = [なし] *暗い

N = 200
インデックス= np.random.choice(range(Y_sklearn.shape [0])、size = N)

範囲(薄暗い)のmの場合:
    範囲(m + 1)のnの場合:
        ax [m、n] .grid(True、alpha = 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( 'コンポーネント' + str(m))
        ax [m、n] .set_ylabel( 'コンポーネント' + str(n))
        #ax [m、n] .set_title( 'HTML tooltips'、size = 20)

        tooltip [m] = plugins.PointHTMLTooltip(scatter、labels、
                                           voffset = 20、hoffset = 20、css = css)
        plugins.connect(fig、tooltip [m])

plugins.connect(fig、plugins.LinkedBrush(scatter))
テスト= mpld3.fig_to_html(fig = fig)

open( "Output.html"、 "w")をtext_fileとして:
    text_file.write(test)

私のブログで実際に見てください

更新[2016年7月9日]:Plot.lyにオフラインモードがあり、現在はオープンソースであることがわかりました。それはたくさんのベルとホイッスルがあらかじめパッケージ化されていますが、MPLD3はまだいくつかのケースで適切かもしれません。


3

私はこれが答えではなくコメントであることを望みます。私の意図はプラグイン/アドバタイズではないからです。しかし、私は現在、あなたの興味を引くかもしれない私の論文に取り組んでいます。実際にはクラスタリングの視覚化ツールですが、k = 1でk-meansを使用すると、用語の検索、エリアの選択、各ノードのコンテンツの表示など、インタラクティブなプロットが得られます。見て、それがあなたのために働くかどうか見てください!

https://github.com/Lilykos/clusterix


涼しい!ちょっと見てみます。
scottlittle 2016年

0

非常に細かい選択、プロットは...

私の場合、スキルに基づいて同様の指定をプロットしようとしていましたが、スキルは300次元のword2vec埋め込みでした。それを3次元のベクトル空間に持ち込み、plotly Scatter3Dを使用して、同じ3D散布図をプロットできました。

エビオラ!! ホバーと拡大機能を備えた素晴らしい3次元グラフを手に入れました。そして、最も良い部分は、それをhtmlファイルとしてエクスポートできることです。プラグアンドプレイを他のPCに適したものにして、ブラウザーにドラッグアンドドロップするだけです(以下のコードに含まれています)。

BEEはもう簡単にできますか

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.