Como faço para criar um gráfico de dispersão PCA interativo em Python?


11

A biblioteca matplotlib é muito capaz, mas carece de interatividade, especialmente dentro do Jupyter Notebook. Eu gostaria de um bom desligada ferramenta como plotagem plot.ly .


3
Eu não sou tão versado em tais coisas, então não consigo escrever uma boa resposta, mas você pode dar uma olhada ipywidgets(exemplos em github.com/ipython/ipywidgets/blob/master/docs/source/examples /… ) Ou bokeh( bokeh.pydata.org/en/latest ).
Torbjørn T. 28/05

Respostas:


10

Existe uma biblioteca impressionante chamada MPLD3 que gera gráficos D3 interativos.

Esse código produz um gráfico interativo em HTML do popular conjunto de dados da íris, compatível com o Jupyter Notebook. Quando o pincel é selecionado, ele permite selecionar um subconjunto de dados a serem destacados entre todos os gráficos. Quando a seta cruzada é selecionada, permite passar o mouse sobre o ponto de dados e ver informações sobre os dados originais. Essa funcionalidade é muito útil ao fazer análise exploratória de dados.

importar matplotlib.pyplot como plt
importar numpy como np
importar pandas como pd
importação marítima como sb
importar mpld3
dos plugins de importação do mpld3
% matplotlib inline

iris = sb.load_dataset ('iris')
de sklearn.preprocessing import StandardScaler
X = pd.get_dummies (íris)
X_scal = StandardScaler (). Fit_transform (X)

dim = 3
sklearn.decomposition import PCA
pca = PCA (n_components = dim)
Y_sklearn = pca.fit_transform (X_scal)

# Defina algumas CSS para controlar nossos rótulos personalizados
css = "" "
tabela
{
  colapso da fronteira: colapso;
}
º
{
  cor: #ffffff;
  cor de fundo: # 000000;
}
td
{
  cor de fundo: #cccccc;
}
mesa, th, td
{
  família de fontes: Arial, Helvetica, sans-serif;
  borda: 1px preto sólido;
  alinhamento de texto: direita;
}
"" "

fig, ax = plt.subplots (dim, dim, figsize = (6,6))
fig.subplots_adjust (hspace = 0,4, wspace = 0,4)
dica = [Nenhuma] * fraca

N = 200
índice = np.random.choice (intervalo (Y_sklearn.shape [0]), tamanho = N)

para m na faixa (fraca):
    para n na faixa (m + 1):
        ax [m, n] .grid (Verdadeiro, alfa = 0,3)
        dispersão = ax [m, n] .scatter (Y_sklearn [índice, m], Y_sklearn [índice, n], alfa = 0,05)

        labels = []
        para i no índice:
            label = X.ix [[i],:]. T.astype (int)
            label.columns = ['Linha {0}'. formato (X.index [i])]
            labels.append (str (label.to_html ()))

        ax [m, n] .set_xlabel ('Componente' + str (m))
        ax [m, n] .set_ylabel ('Componente' + str (n))
        #ax [m, n] .set_title ('Dicas de ferramentas HTML', tamanho = 20)

        dica de ferramenta [m] = plugins.PointHTMLTooltip (dispersão, rótulos,
                                           voffset = 20, hoffset = 20, css = css)
        plugins.connect (fig, dica de ferramenta [m])

plugins.connect (fig, plugins.LinkedBrush (dispersão))
teste = mpld3.fig_to_html (fig = fig)

com aberto ("Output.html", "w") como arquivo de texto:
    text_file.write (teste)

Veja em ação no meu blog .

Atualização [9 de julho de 2016]: Acabei de descobrir que o Plot.ly tem um modo offline e agora é de código aberto. Ele possui muitos sinos e assobios pré-embalados, mas o MPLD3 ainda pode ser apropriado em alguns casos.


3

Eu preferiria que isso fosse um comentário em vez de uma resposta, pois minha intenção não é publicar / anunciar, mas atualmente estou trabalhando em minha tese que pode ser do seu interesse, pois faz o que você deseja. Na realidade, é uma ferramenta de visualização de cluster, mas se você usar k-means com k = 1, terá um gráfico interativo onde poderá procurar termos, selecionar uma área e ver o conteúdo de cada nó e outras coisas. Dê uma olhada e veja se funciona para você!

https://github.com/Lilykos/clusterix


Legal! Vou dar uma olhada.
precisa saber é o seguinte

0

Uma escolha muito boa, o enredo é ...

No meu caso, eu estava tentando traçar uma designação semelhante com base nas habilidades, onde habilidades era uma incorporação word2vec de 300 dimensões; trouxe-o para um espaço vetorial de 3 dimensões e, usando o Scatter3D, consegui plotar um gráfico de dispersão 3D para o mesmo.

Et Viola !! Possui um gráfico impressionante de três dimensões, com funcionalidade de passar o mouse e ampliar. E a melhor parte é que ele pode ser exportado como um arquivo html, tornando-o um plug and play adequado para qualquer outro PC, basta arrastar e soltar em um navegador (incluído no código abaixo).

Pode qualquer coisa ABELHA mais simples

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
)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.