ฉันจะสร้าง Scatterplan แบบ PCA เชิงโต้ตอบใน Python ได้อย่างไร


11

matplotlibห้องสมุดที่มีความสามารถมาก แต่ขาด interactiveness โดยเฉพาะอย่างยิ่งภายใน Jupyter โน๊ตบุ๊ค ฉันต้องการที่ดีออฟไลน์เครื่องมือวางแผนเหมือนplot.ly


3
ฉันไม่คุ้นเคยกับสิ่งเหล่านี้ดังนั้นฉันจึงไม่สามารถเขียนคำตอบที่ดีได้ แต่คุณสามารถดูได้ipywidgets(ตัวอย่างที่github.com/ipython/ipywidgets/blob/master/docs/source/examples / … ) หรือbokeh( bokeh.pydata.org/en/latest )
Torbjørn T.

คำตอบ:


10

มีห้องสมุดที่ยอดเยี่ยมที่เรียกว่าMPLD3ที่สร้างแปลง D3 แบบโต้ตอบ

รหัสนี้สร้างพล็อตเชิงโต้ตอบ HTML ของชุดข้อมูลไอริสยอดนิยมที่เข้ากันได้กับ Jupyter Notebook เมื่อเลือกแปรงทาสีมันจะช่วยให้คุณสามารถเลือกชุดย่อยของข้อมูลที่จะเน้นในแปลงทั้งหมด เมื่อเลือกลูกศรไขว้จะช่วยให้คุณสามารถวางเมาส์เหนือจุดข้อมูลและดูข้อมูลเกี่ยวกับข้อมูลต้นฉบับ ฟังก์ชั่นนี้มีประโยชน์มากเมื่อทำการวิเคราะห์ข้อมูลเชิงสำรวจ

นำเข้า matplotlib.pyplot เป็น plt
นำเข้าจำนวนมากเป็น np
นำเข้านุ่นเป็น pd
นำเข้าทะเลจาก sb
นำเข้า mpld3
จากปลั๊กอินนำเข้า mpld3
% matplotlib แบบอินไลน์

iris = sb.load_dataset ('iris')
จาก sklearn.preprocessing นำเข้า StandardScaler
X = pd.get_dummies (ไอริส)
X_scal = StandardScaler (). fit_transform (X)

สลัว = 3
จาก sklearn.decomposition นำเข้า PCA
pca = PCA (n_components = dim)
Y_sklearn = pca.fit_transform (X_scal)

# กำหนด CSS บางอย่างเพื่อควบคุมป้ายกำกับที่กำหนดเองของเรา
css = "" "
โต๊ะ
{
  การยุบชายแดน: การล่มสลาย;
}
TH
{
  สี: #ffffff;
  สีพื้นหลัง: # 000000;
}
td
{
  สีพื้นหลัง: #cccccc;
}
ตาราง, th, td
{
  ครอบครัวแบบอักษร: Arial, Helvetica, sans-serif;
  เส้นขอบ: สีดำทึบ 1px;
  จัดเรียงข้อความ: ขวา;
}
"""

มะเดื่อ, ขวาน = plt.subplots (สลัวสลัวมะเดื่อ = (6,6))
fig.subplots_adjust (hspace = .4, wspace = .4)
tooltip = [None] * dim

N = 200
ดัชนี = np.random.choice (ช่วง (Y_sklearn.shape [0]), ขนาด = N)

สำหรับ m อยู่ในช่วง (สลัว):
    สำหรับ n อยู่ในช่วง (m + 1):
        ax [m, n] .grid (จริง, 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 (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 ('คำแนะนำเครื่องมือ HTML', ขนาด = 20)

        tooltip [m] = plugins.PointHTMLTooltip (กระจาย, ป้ายกำกับ,
                                           voffset = 20, hoffset = 20, css = css)
        ปลั๊กอินเชื่อมต่อ (รูปที่คำแนะนำเครื่องมือ [m])

plugins.connect (รูปที่, plugins.LinkedBrush (กระจาย))
test = mpld3.fig_to_html (fig = fig)

ด้วย open ("Output.html", "w") เป็น text_file:
    text_file.write (ทดสอบ)

เห็นมันในการดำเนินการในบล็อกของฉัน

อัปเดต [9 กรกฎาคม 2559]: ฉันเพิ่งพบว่า Plot.ly มีโหมดออฟไลน์และตอนนี้เป็นโอเพ่นซอร์ส มันมีระฆังและนกหวีดจำนวนมากบรรจุไว้ล่วงหน้า แต่ MPLD3 อาจยังคงเหมาะสมในบางกรณี


3

ฉันต้องการที่จะแสดงความคิดเห็นแทนคำตอบเนื่องจากฉันไม่ได้ตั้งใจที่จะเสียบ / โฆษณา แต่ตอนนี้ฉันกำลังทำวิทยานิพนธ์ของฉันซึ่งอาจเป็นที่สนใจของคุณตามที่คุณต้องการ ในความเป็นจริงมันเป็นเครื่องมือสร้างภาพข้อมูลการจัดกลุ่ม แต่ถ้าคุณใช้ k-mean ด้วย k = 1 คุณมีพล็อตเชิงโต้ตอบที่คุณสามารถค้นหาคำเลือกพื้นที่และดูเนื้อหาของแต่ละโหนดและสิ่งอื่น ๆ ลองดูและดูว่าเหมาะกับคุณหรือไม่!

https://github.com/Lilykos/clusterix


เย็น! ฉันจะดู
scottlittle

0

ทางเลือกที่ดีมากพล็อตคือ ...

ในกรณีของฉันฉันพยายามพล็อตเรื่องที่คล้ายกันโดยใช้ทักษะซึ่งทักษะคือ word2vec ที่มีการฝัง 300 มิติ นำมาสู่พื้นที่เวกเตอร์ 3 มิติและใช้ Scatter3D อย่างมีแผนฉันก็สามารถพล็อต 3D scatterplot เหมือนกันได้

Et Viola !! มีกราฟ 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
)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.