Làm cách nào để tạo một biểu đồ phân tán PCA tương tác trong Python?


11

Các matplotlib thư viện là rất có khả năng nhưng lại thiếu interactiveness, đặc biệt là bên trong Jupyter Notebook. Tôi muốn một công cụ vẽ ngoại tuyến tốt như cốt truyện .


3
Tôi không rành về những điều như vậy, vì vậy tôi thực sự không thể viết ra một câu trả lời hay, nhưng bạn có thể xem qua ipywidgets(ví dụ tại github.com/ipython/ipywidgets/blob/master/docs/source/examples / Vay ) hoặc bokeh( bokeh.pydata.org/en/latest ).
Torbjørn T.

Câu trả lời:


10

Có một thư viện tuyệt vời gọi là MPLD3 tạo ra các lô D3 tương tác.

Mã này tạo ra một biểu đồ tương tác HTML của bộ dữ liệu iris phổ biến tương thích với Jupyter Notebook. Khi cọ vẽ được chọn, nó cho phép bạn chọn một tập hợp con dữ liệu sẽ được tô sáng trong số tất cả các ô. Khi mũi tên chéo được chọn, nó cho phép bạn di chuột qua điểm dữ liệu và xem thông tin về dữ liệu gốc. Chức năng này rất hữu ích khi thực hiện phân tích dữ liệu thăm dò.

nhập matplotlib.pyplot dưới dạng plt
nhập numpy như np
gấu trúc nhập khẩu như pd
nhập khẩu seaborn như sb
nhập khẩu mpld3
từ plugin nhập mpld3
% matplotlib nội tuyến

iris = sb.load_dataset ('iris')
từ sklearn.pre processing nhập StandardScaler
X = pd.get_dummies (mống mắt)
X_scal = StandardScaler (). Fit_transform (X)

mờ = 3
từ sklearn.decysis nhập PCA
pca = PCA (n_components = mờ)
Y_sklearn = pca.fit_transform (X_scal)

# Xác định một số CSS để kiểm soát nhãn tùy chỉnh của chúng tôi
css = "" "
bàn
{
  sụp đổ biên giới: sụp đổ;
}
thứ tự
{
  màu: #ffffff;
  màu nền: # 000000;
}
td
{
  màu nền: #cccccc;
}
bàn, th, td
{
  họ phông chữ: Arial, Helvetica, sans-serif;
  viền: 1px màu đen;
  văn bản-align: đúng;
}
"" "

fig, ax = plt.subplots (mờ, mờ, figsize = (6,6))
fig.subplots_adjust (hspace = .4, wspace = .4)
tooltip = [Không] * mờ

N = 200
index = np.random.choice (phạm vi (Y_sklearn.shape [0]), size = N)

cho m trong phạm vi (mờ):
    cho n trong phạm vi (m + 1):
        ax [m, n] .grid (Đúng, alpha = 0,3)
        phân tán = ax [m, n] .scatter (Y_sklearn [index, m], Y_sklearn [index, n], alpha = .05)

        nhãn = []
        cho tôi trong chỉ mục:
            nhãn = X.ix [[i] ,:]. T.astype (int)
            nhãn.columns = ['Row {0}'. format (X.index [i])]
            nhãn.append (str (nhãn.to_html ()))

        ax [m, n] .set_xlabel ('Thành phần' + str (m))
        ax [m, n] .set_ylabel ('Thành phần' + str (n))
        #ax [m, n] .set_title ('chú giải công cụ HTML', size = 20)

        tooltip [m] = plugins.PointHTMLTooltip (phân tán, nhãn,
                                           voffset = 20, hoffset = 20, css = css)
        plugins.connect (hình, tooltip [m])

plugins.connect (fig, plugins.LinkedBrush (phân tán))
test = mpld3.fig_to_html (fig = fig)

với open ("Output.html", "w") dưới dạng text_file:
    text_file.write (kiểm tra)

Xem nó trong hành động trên blog của tôi .

Cập nhật [9 tháng 7 năm 2016]: Tôi vừa phát hiện ra rằng Plot.ly có chế độ ngoại tuyến và hiện là nguồn mở. Nó có rất nhiều chuông và còi được đóng gói sẵn, nhưng MPLD3 vẫn có thể phù hợp trong một số trường hợp.


3

Tôi muốn đây là một bình luận thay vì một câu trả lời, vì ý định của tôi là không cắm / quảng cáo, nhưng tôi hiện đang làm luận án của tôi có thể khiến bạn quan tâm vì nó là những gì bạn muốn. Trong thực tế, nó là một công cụ trực quan phân cụm, nhưng nếu bạn sử dụng phương tiện k với k = 1, bạn có một âm mưu tương tác nơi bạn có thể tìm kiếm các thuật ngữ, chọn một khu vực và xem nội dung của từng nút và các nội dung khác. Hãy xem và xem nếu nó làm việc cho bạn!

https://github.com/Lilykos/clusterix


Mát mẻ! Tôi sẽ có một cái nhìn.
scottlittle

0

Một lựa chọn rất tốt, cốt truyện là ...

Trong trường hợp của tôi, tôi đã cố gắng vẽ đồ thị tương tự dựa trên các kỹ năng, trong đó các kỹ năng là một word2vec nhúng 300 chiều; đưa nó đến một không gian vectơ 3 chiều và sử dụng Scatter3D theo cốt truyện, tôi có thể vẽ sơ đồ phân tán 3D cho cùng.

Et Viola !! Có một biểu đồ 3 chiều tuyệt vời, với chức năng di chuột và phóng to. Và phần tốt nhất là nó có thể được xuất dưới dạng tệp html, làm cho nó trở thành một trình cắm và phát phù hợp với mọi PC khác, chỉ cần kéo và thả trong trình duyệt (có trong mã bên dưới).

Có thể bất cứ điều gì BEE nữa đơn giản hơn

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
)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.