Come faccio a creare un grafico a dispersione interattivo PCA in Python?


11

La libreria matplotlib è molto capace ma manca di interattività, specialmente all'interno di Jupyter Notebook. Vorrei una buona linea strumento come tracciato plot.ly .


3
Non sono molto esperto di queste cose, quindi non posso davvero scrivere una buona risposta, ma puoi dare un'occhiata ipywidgets(esempi su github.com/ipython/ipywidgets/blob/master/docs/source/examples / ... ) o bokeh( bokeh.pydata.org/en/latest ).
Torbjørn T.,

Risposte:


10

C'è una fantastica libreria chiamata MPLD3 che genera grafici D3 interattivi.

Questo codice produce un grafico interattivo HTML del popolare set di dati dell'iride compatibile con Jupyter Notebook. Quando il pennello è selezionato, consente di selezionare un sottoinsieme di dati da evidenziare tra tutti i grafici. Quando si seleziona la freccia incrociata, è possibile passare il mouse sopra il punto dati e visualizzare le informazioni sui dati originali. Questa funzionalità è molto utile durante l'analisi dei dati esplorativi.

import matplotlib.pyplot come plt
importa numpy come np
importare i panda come pd
importare nato come sb
import mpld3
dai plugin di importazione mpld3
% matplotlib inline

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

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

# Definisci alcuni CSS per controllare le nostre etichette personalizzate
css = "" "
tavolo
{
  confine-collasso: collasso;
}
esimo
{
  colore: #ffffff;
  colore di sfondo: # 000000;
}
TD
{
  colore di sfondo: #cccccc;
}
tabella, th, td
{
  famiglia di caratteri: Arial, Helvetica, sans-serif;
  bordo: 1px nero solido;
  text-align: right;
}
"""

fig, ax = plt. sottopiatti (dim, dim, figsize = (6,6))
fig.subplots_adjust (hspace = .4, wspace = .4)
tooltip = [Nessuno] * dim

N = 200
indice = np.random.choice (intervallo (Y_sklearn.shape [0]), size = N)

per m nel raggio di azione (attenuato):
    per n nell'intervallo (m + 1):
        ax [m, n] .grid (True, alpha = 0.3)
        scatter = ax [m, n] .scatter (Y_sklearn [indice, m], Y_sklearn [indice, n], alfa = .05)

        etichette = []
        per i nell'indice:
            etichetta = 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 ("Suggerimenti HTML", dimensione = 20)

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

plugins.connect (fig, plugins. LinkedBrush (scatter))
test = mpld3.fig_to_html (fig = fig)

con open ("Output.html", "w") come testo_file:
    text_file.write (test)

Guardalo in azione sul mio blog .

Aggiornamento [9 luglio 2016]: ho appena scoperto che Plot.ly ha una modalità offline ed è ora open source. Ha molte campane e fischietti preconfezionati, ma in alcuni casi MPLD3 può ancora essere appropriato.


3

Preferirei che questo fosse un commento invece di una risposta, poiché la mia intenzione non è quella di collegare / pubblicizzare, ma attualmente sto lavorando alla mia tesi che potrebbe interessarti in quanto fa un po 'quello che vuoi. In realtà è uno strumento di visualizzazione di clustering, ma se usi k-mean con k = 1 hai un grafico interattivo in cui puoi cercare termini, selezionare un'area e vedere il contenuto di ciascun nodo e altre cose. Dai un'occhiata e vedi se funziona per te!

https://github.com/Lilykos/clusterix


Freddo! Darò un occhiata.
Scott

0

Una scelta eccellente, la trama è ...

Nel mio caso, stavo cercando di tracciare una designazione simile basata sulle abilità, in cui le abilità erano un incorporamento word2vec di 300 dimensioni; lo ho portato in uno spazio vettoriale di 3 dimensioni e, usando Scatter3D, ho potuto tracciare un grafico a dispersione 3D per lo stesso.

Et Viola !! Hai un fantastico grafico a 3 dimensioni, con funzionalità hover e ingrandire. E la parte migliore è che può essere esportato come file html, rendendolo un plug and play adatto a qualsiasi altro PC, basta trascinare e rilasciare in un browser (incluso nel codice seguente).

Qualcosa può essere più semplice

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
)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.