Wie erstelle ich ein interaktives PCA-Streudiagramm in Python?

11

Die matplotlib- Bibliothek ist sehr leistungsfähig, weist jedoch keine Interaktivität auf, insbesondere in Jupyter Notebook. Ich würde ein gutes wie Offline - Tool wie Plotten plot.ly .

scottlittle
quelle
3
Ich bin mit solchen Dingen nicht so gut vertraut, daher kann ich keine gute Antwort schreiben, aber Sie können sie sich ansehen ipywidgets(Beispiele unter github.com/ipython/ipywidgets/blob/master/docs/source/examples) /… ) Oder bokeh( bokeh.pydata.org/en/latest ).
Torbjørn T.

Antworten:

10

Es gibt eine großartige Bibliothek namens MPLD3 , die interaktive D3-Diagramme generiert.

Dieser Code erstellt ein interaktives HTML-Diagramm des beliebten Iris-Datasets, das mit Jupyter Notebook kompatibel ist. Wenn der Pinsel ausgewählt ist, können Sie eine Teilmenge der Daten auswählen, die unter allen Plots hervorgehoben werden sollen. Wenn der Kreuzpfeil ausgewählt ist, können Sie mit der Maus über den Datenpunkt fahren und Informationen zu den Originaldaten anzeigen. Diese Funktionalität ist sehr nützlich, wenn Sie explorative Datenanalysen durchführen.

importiere matplotlib.pyplot als plt
importiere numpy als np
Pandas als pd importieren
Import Seaborn als jdn
mpld3 importieren
von mpld3 Import Plugins
% matplotlib inline

iris = sb.load_dataset ('iris')
aus sklearn.preprocessing Import StandardScaler
X = pd.get_dummies (Iris)
X_scal = StandardScaler (). Fit_transform (X)

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

# Definieren Sie CSS, um unsere benutzerdefinierten Beschriftungen zu steuern
css = "" "
Tabelle
{
  Grenzkollaps: Kollaps;
}}
th
{
  Farbe: #ffffff;
  Hintergrundfarbe: # 000000;
}}
td
{
  Hintergrundfarbe: #cccccc;
}}
Tabelle, th, td
{
  Schriftfamilie: Arial, Helvetica, serifenlos;
  Rand: 1px festes Schwarz;
  Textausrichtung: rechts;
}}
"" "

fig, ax = plt.subplots (dim, dim, figsize = (6,6))
fig.subplots_adjust (hspace = .4, wspace = .4)
Tooltip = [Keine] * dim

N = 200
index = np.random.choice (Bereich (Y_sklearn.shape [0]), Größe = N)

für m im Bereich (dim):
    für n im Bereich (m + 1):
        ax [m, n] .grid (True, alpha = 0,3)
        Scatter = Ax [m, n]. Scatter (Y_sklearn [Index, m], Y_sklearn [Index, n], Alpha = 0,05)

        label = []
        für i im Index:
            label = X.ix [[i] ,:]. T.astype (int)
            label.columns = ['Zeile {0}'. Format (X.index [i])]
            label.append (str (label.to_html ()))

        ax [m, n] .set_xlabel ('Komponente' + str (m))
        ax [m, n] .set_ylabel ('Komponente' + str (n))
        #ax [m, n] .set_title ('HTML-Tooltips', Größe = 20)

        tooltip [m] = plugins.PointHTMLTooltip (Streuung, Beschriftungen,
                                           voffset = 20, hoffset = 20, css = css)
        plugins.connect (Abb. Tooltip [m])

plugins.connect (Abb. plugins.LinkedBrush (Scatter))
test = mpld3.fig_to_html (fig = fig)

mit open ("Output.html", "w") als text_file:
    text_file.write (Test)

Sehen Sie es in Aktion auf meinem Blog .

Update [9. Juli 2016]: Ich habe gerade herausgefunden, dass Plot.ly einen Offline-Modus hat und jetzt Open Source ist. Es hat viele Schnickschnack vorverpackt, aber MPLD3 kann in einigen Fällen immer noch angemessen sein.

scottlittle
quelle
3

Ich würde es vorziehen, wenn dies ein Kommentar anstelle einer Antwort wäre, da ich nicht beabsichtige, Werbung zu schalten, aber ich arbeite derzeit an meiner These, die für Sie von Interesse sein könnte, da sie das tut, was Sie wollen. In Wirklichkeit handelt es sich um ein Clustering-Visualisierungswerkzeug. Wenn Sie jedoch k-means mit k = 1 verwenden, haben Sie ein interaktives Diagramm, in dem Sie nach Begriffen suchen, einen Bereich auswählen und den Inhalt jedes Knotens anzeigen können. Schauen Sie nach, ob es für Sie funktioniert!

https://github.com/Lilykos/clusterix

Lilykos
quelle
Cool! Ich gucke mal.
Scottlittle
0

Eine sehr gute Wahl, viel ...

In meinem Fall habe ich versucht, eine ähnliche Bezeichnung basierend auf Fähigkeiten zu zeichnen, wobei Fähigkeiten eine word2vec-Einbettung von 300 Dimensionen waren. brachte es in einen dreidimensionalen Vektorraum und mit plotly Scatter3D konnte ich ein 3D-Streudiagramm für dasselbe zeichnen.

Et Viola !! Ich habe ein fantastisches dreidimensionales Diagramm mit Hover- und Vergrößerungsfunktionen. Und das Beste daran ist, dass es als HTML-Datei exportiert werden kann, was es zu einem Plug-and-Play-Gerät macht, das für jeden anderen PC geeignet ist. Ziehen Sie es einfach per Drag & Drop in einen Browser (im folgenden Code enthalten).

Kann etwas einfacher sein

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
)
Itachi
quelle