Python'da etkileşimli bir PCA dağılım grafiğini nasıl oluştururum?


11

Matplotlib kütüphanesi özellikle Jupyter Notebook içinde çok yetenekli ama interactiveness yoksun. Plot.ly gibi iyi bir çevrimdışı çizim aracı istiyorum .


3
Bu tür şeylerle o kadar bilgili değilim, bu yüzden gerçekten iyi bir cevap yazamıyorum, ancak bir göz atabilirsinizipywidgets ( github.com/ipython/ipywidgets/blob/master/docs/source/examples adresindeki örnekler) /… ) Veya bokeh( bokeh.pydata.org/en/latest ).
Torbjørn T.

Yanıtlar:


10

Etkileşimli D3 grafikleri oluşturan MPLD3 adlı harika bir kütüphane var .

Bu kod, Jupyter Notebook ile uyumlu popüler iris veri kümesinin HTML etkileşimli bir grafiğini üretir. Boya fırçası seçildiğinde, tüm grafikler arasında vurgulanacak bir veri alt kümesi seçmenizi sağlar. Çapraz ok seçildiğinde, veri noktasını fareyle üzerine getirmenize ve orijinal verilerle ilgili bilgileri görmenize olanak tanır. Bu işlevsellik, keşifsel veri analizi yaparken çok kullanışlıdır.

matplotlib.pyplot dosyasını plt olarak içe aktar
np'yi np olarak içe aktar
pandaları pd olarak içe aktar
sb olarak ithal deniz
ithalat mpld3
mpld3 içe aktarma eklentilerinden
% matplotlib satır içi

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

dim = 3
sklearn.decomposition ithalat PCA dan
pca = PCA (n_component = dim)
Y_sklearn = pca.fit_transform (X_scal)

# Özel etiketlerimizi kontrol etmek için bazı CSS tanımlayın
css = "" "
tablo
{
  sınır çöküşü: çöküş;
}
inci
{
  renk: #ffffff;
  arka plan rengi: # 000000;
}
td
{
  arka plan rengi: #cccccc;
}
tablo, th, td
{
  yazı tipi ailesi: Arial, Helvetica, sans-serif;
  sınır: 1 piksel düz siyah;
  metin hizalama: sağ;
}
"""

incir, balta = plt. alt grafikleri (dim, dim, figsize = (6,6))
fig.subplots_adjust (hspace = .4, wspace = .4)
ipucu = [Yok] * loş

N = 200
index = np.random.choice (aralık (Y_sklearn.shape [0]), boyut = N)

m aralığında (dim):
    n aralığında (m + 1):
        ax [m, n] .grid (Doğru, alfa = 0,3)
        dağılım = balta [m, n]. dağılım (Y_sklearn [dizin, m], Y_sklearn [dizin, n], alfa = .05)

        etiketleri = []
        dizindeki i için:
            label = X.ix [[i],:]. T.astype (int)
            label.columns = ['Satır {0}'. biçimi (X.index [i])]
            labels.append (str (label.to_html ()))

        ax [m, n] .set_xlabel ('Bileşen' + str (m))
        ax [m, n] .set_ylabel ('Bileşen' + str (n))
        #ax [m, n] .set_title ('HTML araç ipuçları', boyut = 20)

        tooltip [m] = eklentiler.PointHTMLTooltip (dağılım, etiketler,
                                           voffset = 20, hoffset = 20, css = css)
        plugins.connect (incir, ipucu [m])

plugins.connect (incir, plugins.LinkedBrush (dağılım))
test = mpld3.fig_to_html (şek = incir)

text_file olarak open ("Output.html", "w") ile:
    text_file.write (test)

Blogumda çalışırken görün .

Güncelleme [9 Temmuz 2016]: Plot.ly'nin çevrimdışı bir modu olduğunu ve şimdi açık kaynak olduğunu öğrendim. Önceden paketlenmiş çok sayıda çan ve ıslık var, ancak bazı durumlarda MPLD3 yine de uygun olabilir.


3

Niyetim takmak / tanıtmak değil, çünkü şu anda bir cevap yerine bir yorum olmasını tercih ederim, ama şu anda bu tür ne istediğinizi yapar gibi ilginizi çekebilir tezimi üzerinde çalışıyorum. Gerçekte bu bir kümeleme görselleştirme aracıdır, ancak k = 1 ile k-araçlarını kullanırsanız, terimleri arayabileceğiniz, bir alan seçebileceğiniz ve her düğümün içeriğini ve diğer şeyleri görebileceğiniz etkileşimli bir planınız vardır. Bir göz atın ve işinize yarayıp yaramadığını görün!

https://github.com/Lilykos/clusterix


Güzel! Bir göz atacağım.
scottlittle

0

Çok iyi bir seçim, plotly ...

Benim durumumda, becerilerin 300 boyuta gömülü bir word2vec olduğu becerilere dayalı benzer bir atama yapmaya çalışıyordum; 3 boyutlu bir vektör uzayına getirdi ve Scatter3D'yi plotly kullanarak, bunun için bir 3D dağılım grafiğini çizebildim.

Et Viola !! Fareyle üzerine gelme ve büyütme işlevleriyle harika bir 3 boyutlu grafiğiniz var. Ve en iyi yanı, bir html dosyası olarak dışa aktarılabilmesidir, bu da onu herhangi bir PC için uygun bir tak ve çalıştır, sadece bir tarayıcıda sürükleyip bırakın (aşağıdaki kodda bulunur).

Artık her şey daha kolay olabilir mi?

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
)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.