Как создать интерактивную диаграмму рассеяния PCA на Python?

11

Библиотека matplotlib очень способна, но ей не хватает интерактивности, особенно внутри Jupyter Notebook. Я хотел бы хороший автономные черчения инструмента , как plot.ly .

scottlittle
источник
3
Я не очень хорошо разбираюсь в таких вещах, поэтому я не могу написать хороший ответ, но вы можете посмотреть ipywidgets(примеры на github.com/ipython/ipywidgets/blob/master/docs/source/examples /… ) Или bokeh( bokeh.pydata.org/en/latest ).
Торбьерн Т.

Ответы:

10

Существует удивительная библиотека под названием MPLD3, которая генерирует интерактивные графики D3.

Этот код создает интерактивный сюжет HTML популярного набора данных iris, который совместим с Jupyter Notebook. Когда кисть выбрана, она позволяет вам выбрать подмножество данных, которые будут выделены среди всех графиков. Когда выбрана перекрестная стрелка, она позволяет навести курсор мыши на точку данных и просмотреть информацию об исходных данных. Эта функциональность очень полезна при проведении исследовательского анализа данных.

импортировать matplotlib.pyplot как plt
импортировать numpy как np
импорт панд в виде pd
импорт морского как sb
импорт mpld3
из плагинов импорта mpld3
% matplotlib встроенный

iris = sb.load_dataset ('iris')
из sklearn.процесс обработки импорта StandardScaler
X = pd.get_dummies (радужная оболочка)
X_scal = StandardScaler (). Fit_transform (X)

дим = 3
от склеарн.разложение импорта спс
pca = PCA (n_components = dim)
Y_sklearn = pca.fit_transform (X_scal)

# Определите CSS для управления нашими пользовательскими метками
css = "" "
Таблица
{
  коллапс границы: коллапс;
}
го
{
  цвет: #ffffff;
  цвет фона: # 000000;
}
тд
{
  цвет фона: #cccccc;
}
стол, тд, тд
{
  семейство шрифтов: Arial, Helvetica, без засечек;
  граница: 1px сплошной черный;
  выравнивание текста: справа;
}
«»»

fig, ax = plt.subplots (dim, dim, figsize = (6,6))
fig.subplots_adjust (hspace = .4, wspace = .4)
подсказка = [Нет] * тусклый

N = 200
index = np.random.choice (range (Y_sklearn.shape [0]), размер = N)

для м в диапазоне (тусклый):
    для n в диапазоне (m + 1):
        ax [m, n] .grid (True, alpha = 0.3)
        scatter = ax [m, n] .scatter (Y_sklearn [index, m], Y_sklearn [index, n], alpha = .05)

        метки = []
        для меня в индексе:
            label = X.ix [[i],:]. T.astype (int)
            label.columns = ['Row {0}'. format (X.index [i])]
            labels.append (ул (label.to_html ()))

        ax [m, n] .set_xlabel ('Компонент' + str (m))
        ax [m, n] .set_ylabel ('Компонент' + str (n))
        #ax [m, n] .set_title ('подсказки HTML', размер = 20)

        tooltip [m] = plugins.PointHTMLTooltip (разброс, метки,
                                           voffset = 20, hoffset = 20, css = css)
        plugins.connect (рис., подсказка [м])

plugins.connect (рис. plugins.LinkedBrush (scatter))
test = mpld3.fig_to_html (рис = рис)

с открытым ("Output.html", "w") как text_file:
    text_file.write (тест)

Смотрите это в действии на моем блоге .

Обновление [9 июля 2016 года]: я только что узнал, что Plot.ly имеет автономный режим и теперь с открытым исходным кодом. В нем много колокольчиков, но MPLD3 все еще может быть уместным в некоторых случаях.

scottlittle
источник
3

Я бы предпочел, чтобы это был комментарий, а не ответ, поскольку я не собираюсь подключать / рекламировать, но в настоящее время я работаю над своей диссертацией, которая может быть вам интересна, поскольку она делает то, что вы хотите. На самом деле это инструмент визуализации кластеризации, но если вы используете k-средних с k = 1, у вас есть интерактивный график, где вы можете искать термины, выбирать область и видеть содержимое каждого узла и другие вещи. Посмотрите и посмотрите, работает ли он для вас!

https://github.com/Lilykos/clusterix

Lilykos
источник
Прохладно! Я посмотрю.
Скоттлиттл
0

Очень прекрасный выбор, plotly является ...

В моем случае я пытался построить похожее обозначение на основе навыков, где навыки представляли собой вложение word2vec из 300 измерений; перенес его в трехмерное векторное пространство, и с помощью графика Scatter3D я смог построить для него трехмерную диаграмму рассеяния.

Эт альт !! Получил потрясающий 3-х мерный график с возможностью наведения и увеличения. И лучшая часть его можно экспортировать в виде HTML-файла, что делает его подключи и играй подходит для любого другого компьютера, просто перетащить в браузере (включен в код ниже).

Может что-нибудь BEE больше проще

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
)
Итачи
источник