如何在Python中制作交互式PCA散点图?


11

matplotlib库是非常有能力,但缺乏互动性,尤其是里面Jupyter笔记本。我想一个好的离线绘图工具一样plot.ly


3
我不太了解这些事情,因此我无法真正写出一个好的答案,但是您可以看一下ipywidgets(示例在github.com/ipython/ipywidgets/blob/master/docs/source/examples /…)或bokehbokeh.pydata.org/en/latest)。
TorbjørnT.

Answers:


10

有一个很棒的库叫MPLD3,它可以生成交互式D3图。

此代码生成与Jupyter Notebook兼容的流行虹膜数据集的HTML交互式图。选择画笔时,它允许您在所有绘图中选择要突出显示的数据子集。选择十字箭头后,它允许您将鼠标悬停在数据点上并查看有关原始数据的信息。在进行探索性数据分析时,此功能非常有用。

导入matplotlib.pyplot作为plt
将numpy导入为np
将熊猫作为pd导入
进口seaborn为某人
导入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 =昏暗)
Y_sklearn = pca.fit_transform(X_scal)

#定义一些CSS来控制我们的自定义标签
css =“”“
表
{
  边界崩溃:崩溃;
}
日
{
  颜色:#ffffff;
  背景颜色:#000000;
}
d
{
  背景颜色:#cccccc;
}
桌子,TH,TD
{
  字体家族:Arial,Helvetica,sans-serif;
  边框:1px纯黑色;
  文字对齐:右;
}
“”

无花果,ax = plt.subplots(dim,dim,figsize =(6,6))
fig.subplots_adjust(hspace = .4,wspace = .4)
工具提示= [无] *暗淡

N = 200
索引= np.random.choice(范围(Y_sklearn.shape [0]),大小= N)

对于m(范围)(dim):
    对于范围(m + 1)中的n:
        ax [m,n] .grid(真,alpha = 0.3)
        scatter = ax [m,n] .scatter(Y_sklearn [index,m],Y_sklearn [index,n],alpha = .05)

        标签= []
        对于索引中的我:
            标签= X.ix [[i],:]。T.astype(int)
            label.columns = ['Row {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 tooltip',size = 20)

        工具提示[m] = plugins.PointHTMLTooltip(散布,标签,
                                           voffset = 20,hoffset = 20,css = css)
        plugins.connect(图,工具提示[m])

plugins.connect(图,plugins.LinkedBrush(散布))
测试= mpld3.fig_to_html(fig = fig)

使用open(“ Output.html”,“ w”)作为text_file:
    text_file.write(测试)

在我的博客上查看它的运行情况

更新[2016年7月9日]:我刚刚发现Plot.ly具有脱机模式,并且现在是开源的。它有很多预先包装的铃铛,但是在某些情况下,MPLD3可能仍然适用。


3

我希望这不是评论,而是评论,因为我的意图不是插入/做广告,但是我目前正在研究自己的论文,这可能对您很感兴趣,因为它确实可以满足您的需求。实际上,它是一个聚类可视化工具,但是如果您使用k-means且k = 1,则会有一个交互式绘图,您可以在其中搜索项,选择区域并查看每个节点的内容以及其他内容。看看它是否适合您!

https://github.com/Lilykos/clusterix


凉!我来看一下
scottlittle '16

0

一个非常好的选择,可想而知是...

就我而言,我试图根据技能绘制相似的名称,其中技能是300个维度的word2vec嵌入;将其带到3维矢量空间,并使用plotly Scatter3D,我能够为其绘制3D散点图。

中提琴!有一个很棒的3D图形,具有悬停和放大功能。最好的部分是它可以导出为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
)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.