Jak utworzyć interaktywny wykres rozproszenia PCA w Pythonie?

11

Matplotlib biblioteka jest bardzo zdolny, ale brakuje interaktywność, zwłaszcza wewnątrz Jupyter notebooka. Chciałbym dobro nieaktywny kreślenia narzędzie jak plot.ly .

scottlittle
źródło
3
Nie jestem zbyt dobrze zaznajomiony z takimi rzeczami, więc nie mogę naprawdę napisać dobrej odpowiedzi, ale możesz rzucić okiem ipywidgets(przykłady na github.com/ipython/ipywidgets/blob/master/docs/source/examples /… ) Lub bokeh( bokeh.pydata.org/en/latest ).
Torbjørn T.

Odpowiedzi:

10

Istnieje niesamowita biblioteka o nazwie MPLD3, która generuje interaktywne wykresy D3.

Ten kod tworzy interaktywny wykres HTML popularnego zestawu danych tęczówki, który jest zgodny z Jupyter Notebook. Po wybraniu pędzla umożliwia wybranie podzestawu danych, który zostanie wyróżniony wśród wszystkich wykresów. Po wybraniu strzałki krzyżowej można najechać myszką na punkt danych i wyświetlić informacje o oryginalnych danych. Ta funkcja jest bardzo przydatna podczas analizy danych eksploracyjnych.

zaimportuj matplotlib.pyplot jako plt
zaimportuj numpy jako np
importuj pandy jako pd
import dna morskiego jako sb
import mpld3
z wtyczek importu mpld3
% inline matplotlib

iris = sb.load_dataset („iris”)
z sklearn.preprocessing import StandardScaler
X = pd.get_dummies (tęczówka)
X_scal = StandardScaler (). Fit_transform (X)

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

# Zdefiniuj trochę CSS, aby kontrolować nasze niestandardowe etykiety
css = "" "
stół
{
  border-collapse: collapse;
}
th
{
  kolor: #ffffff;
  kolor tła: # 000000;
}
td
{
  kolor tła: #cccccc;
}
table, th, td
{
  rodzina czcionek: Arial, Helvetica, sans-serif;
  obramowanie: jednolity czarny 1px;
  wyrównanie tekstu: prawo;
}
„” „

rys. ax = plt. rysunki (dim, dim, figsize = (6,6))
rys.subplots_adjust (hspace = .4, wspace = .4)
tooltip = [None] * dim

N = 200
index = np.losowy.choice (zakres (Y_sklearn.shape [0]), rozmiar = N)

dla mw zakresie (dim):
    dla nw zakresie (m + 1):
        ax [m, n] .grid (True, alpha = 0.3)
        scatter = ax [m, n]. scatter (Y_sklearn [indeks, m], Y_sklearn [indeks, n], alfa = .05)

        etykiety = []
        dla i w indeksie:
            label = 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 („Podpowiedzi HTML”, rozmiar = 20)

        tooltip [m] = plugins.PointHTMLTooltip (rozproszenie, etykiety,
                                           voffset = 20, hoffset = 20, css = css)
        plugins.connect (rys., etykietka [m])

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

z otwartym („Output.html”, „w”) jako plikiem tekstowym:
    text_file.write (test)

Zobacz to w akcji na moim blogu .

Aktualizacja [9 lipca 2016 r.]: Właśnie dowiedziałem się, że Plot.ly ma tryb offline i jest teraz open source. Ma wiele zapakowanych dzwonków i gwizdków, ale w niektórych przypadkach MPLD3 może nadal być odpowiedni.

scottlittle
źródło
3

Wolałbym, aby był to komentarz zamiast odpowiedzi, ponieważ moim zamiarem nie jest wtyczka / reklama, ale obecnie pracuję nad moją tezą, która może cię zainteresować, ponieważ robi to, co chcesz. W rzeczywistości jest to narzędzie do wizualizacji klastrów, ale jeśli używasz k-średnich z k = 1, masz interaktywny wykres, w którym możesz wyszukiwać terminy, wybierać obszar i widzieć zawartość każdego węzła i inne rzeczy. Zobacz, czy to działa dla Ciebie!

https://github.com/Lilykos/clusterix

Lilykos
źródło
Fajne! Zobaczę.
scottlittle
0

Bardzo dobry wybór, fabuła to ...

W moim przypadku próbowałem wykreślić podobne oznaczenie oparte na umiejętnościach, przy czym umiejętności były osadzone w word2vec o 300 wymiarach; przeniosłem go do trójwymiarowej przestrzeni wektorowej i korzystając z fabularnego Scatter3D, byłem w stanie wykreślić trójwymiarowy wykres rozproszenia dla tego samego.

Et Viola !! Masz niesamowity trójwymiarowy wykres z funkcjami najechania i powiększenia. A najlepsze jest to, że można go wyeksportować jako plik HTML, dzięki czemu można go podłączyć do dowolnego komputera, po prostu przeciągnij i upuść w przeglądarce (zawartej w poniższym kodzie).

Czy coś może być BEE już prostsze

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
źródło