Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Widget Matplotlib

Matplotlib tidak hanya untuk plot statis. Sementara GUI biasanya dibuat dengan pustaka dan kerangka kerja GUI seperti: PyQt, Tkinter, Putus asa dan wxPython, dan meskipun Python memiliki integrasi yang sangat baik dengan PyQt, Tkinter dan wxPython โ€“ tidak perlu menggunakan semua ini untuk beberapa fungsionalitas GUI dasar, melalui Widget Matplotlib.

Grafik matplotlib.widgets modul memiliki beberapa kelas, termasuk AxesWidget, dari yang mana Buttons, CheckButtons, Sliders, TextBoxes, dll diturunkan. Ini semua menerima Axes mereka ditambahkan sebagai satu-satunya argumen konstruktor wajib, dan posisinya harus diatur secara manual. Hal yang perlu diperhatikan adalah widget adalah sumbunya, jadi Anda akan membuat Axes contoh untuk setiap widget.

Hal lain yang perlu diperhatikan adalah Anda harus menyimpan referensi ke widget jika tidak, mereka mungkin mengumpulkan sampah.

Masing-masing juga dapat dinonaktifkan dengan mengatur active untuk False, dalam hal ini, mereka tidak akan menanggapi peristiwa apa pun, seperti diklik. Karena itu, kami dapat memperkenalkan jenis interaktivitas baru ke plot kami, melalui berbagai elemen dan komponen GUI.

Catatan: Matplotlib tidak dimaksudkan untuk digunakan untuk pembuatan GUI berkualitas tinggi, atau sistem yang ramah pengguna. Widget ini belum sempurna, tidak terlalu terlihat bagus dan memiliki fungsionalitas terbatas. Mereka dimaksudkan sebagai cara untuk membuat prototipe dan menguji berbagai hal, daripada benar-benar mengirimkannya.

Jika Anda pernah bekerja dengan PyQt sebelumnya โ€“ Anda mungkin memperhatikan bahwa sintaks umum dan pendekatan untuk menambahkan widget ini, serta menghubungkannya ke event handler cukup familiar.

Menambahkan Tombol

Mari kita mulai dengan tombol - Yang matplotlib.widgets modul mendefinisikan a Button kelas. Untuk menghubungkannya, kami memanggil on_clicked() fungsi, yang menjalankan fungsi yang kami suplai. Setelah klik terdeteksi, fungsi dijalankan.

Saat membuat tombol, kami menetapkan Axes untuk itu, digunakan untuk penentuan posisi. Kami juga dapat melewati label pada saat itu, untuk menambahkan beberapa teks dan membubuhi keterangan untuk pengguna. Itu color dan hovercolor argumen menentukan warna tombol sebelum dan sesudah dilayangkan.

Karena kami mengatur posisi dan ruang untuk semua widget โ€“ mari kita buat Figure dan Axes, beri jarak di bagian bawah untuk menambahkan tombol, dan plot Scatter Plot kosong. Kemudian, kita akan mendefinisikan EventHandler kelas, yang memiliki metode tunggal add_random(). Metode ini menghasilkan dua angka acak, dan memplot penanda untuk mereka di Axes kami telah membuat sebelumnya dan memanggil plt.draw(), yang menggambar ulang Figure. Saat memperbarui plot, kami harus selalu menelepon plt.draw() lagi untuk benar-benar memperbaruinya:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
plot = ax.scatter([], []) class EventHandler: def add_random(self, event): x = np.random.randint(0, 100) y = np.random.randint(0, 100) ax.scatter(x, y) plt.draw() # Axes for the Button and positioning
# xposition and yposition in percentages, width, height
button_ax = plt.axes([0.7, 0.05, 0.2, 0.07])
# Create Button and assign it to `button_ax` with label
button = Button(button_ax, 'Add Random', color='green', hovercolor='red')
# On a detected click, execute add_random()
button.on_clicked(EventHandler().add_random) plt.show()

Ini menghasilkan Figure, dengan kosong Axes di dalamnya dan tombol di sudut kanan atas layar, dengan sendirinya Axes:

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Dan setelah menekan tombol beberapa lusin kali, kami ax akan diisi dengan penanda acak:

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Dalam istilah yang lebih praktis, kita dapat membuat siklus fitur untuk diplot pada setiap tekan tombol. Ini membutuhkan beberapa penyesuaian untuk EventHandler, serta tombol lain untuk kembali melalui siklus tersebut.

Mari gunakan Kualitas Anggur Merah dataset lagi, dan memvisualisasikan beberapa fitur terhadap Alkohol fitur. Karena kita tidak dapat diganggu untuk memplot ini satu per satu dengan menulis kode untuk memplot satu fitur terhadap yang lain, dan kemudian memodifikasi kode itu untuk memplot fitur lain terhadap yang lain.

Membuat Scatter Matrix mungkin membantu kami di sini, tetapi jika kumpulan data memiliki banyak fitur, itu akan cukup tidak terbaca dan kami tidak akan pergi jauh. Jika Anda ingin memiliki kedua plot skala besar yang dapat Anda lihat dan tafsirkan dengan mudah, . karena memiliki banyak fitur yang berputar tanpa usaha ekstra โ€“ Anda dapat mengotomatiskan proses ini dengan tombol:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv')
plot = ax.scatter([], []) class EventHandler: i = 0 # Find and plot next feature, re-draw the Axes def next_feature(self, event): # If the counter is at the end of the columns # Revert it back to 0 to cycle through again if self.i >= len(df.columns): self.i = 0 # Clear Axes from last plot ax.cla() # Plot a feature against a feature located on the `i` column ax.scatter(df['alcohol'], df.iloc[:,self.i]) # Set labels ax.set_xlabel('Alcohol') ax.set_ylabel(df.columns[self.i]) # Increment i self.i += 1 # Update Figure plt.draw() def previous_feature(self, event): # If the counter is at the start of the columns # Revert it back to the last column to cycle through if self.i <= 0: self.i = len(df.columns)-1 ax.cla() ax.scatter(df['alcohol'], df.iloc[:,self.i]) ax.set_xlabel('Alcohol') ax.set_ylabel(df.columns[self.i]) self.i -= 1 plt.draw() # Add buttons
button1_ax = plt.axes([0.7, 0.02, 0.2, 0.07])
next_button = Button(button1_ax, 'Next Feature')
next_button.on_clicked(EventHandler().next_feature) button2_ax = plt.axes([0.45, 0.02, 0.2, 0.07])
previous_button = Button(button2_ax, 'Previous Feature')
previous_button.on_clicked(EventHandler().previous_feature) plt.show()

Grafik EventHandler kelas sekarang memiliki dua metode - next_feature() dan previous_feature(). Keduanya memeriksa apakah penghitung i telah mencapai akhir atau awal dari daftar kolom โ€“ dan untuk menghindari IndexError, kami mengatur ulang indeks ke nilai yang berlawanan dan mensimulasikan a siklus. Pergi ke bawah 0 akan membawa kita kembali ke akhir dari daftar kolom, dan pergi di atas kolom terakhir akan mengembalikan kita kembali ke yang pertama.

Setelah memastikan di mana kami berada โ€“ kami bersihkan Axes, karena kami akan membuat plot lagi di atas plot yang ada tanpa membersihkannya melalui cla() (cltelinga ax). Sebagai alternatif, Anda juga dapat menumpuk relasi fitur, dengan memplot satu sama lain dan menggunakan cla() pernyataan saat mengatur ulang indeks di akhir/awal siklus.

Setelah membersihkan file Axes โ€“ kami memiliki kanvas bersih untuk dilukis dengan ax.scatter() fungsi. Dalam contoh ini, fitur tetapnya adalah Alkohol, jadi selalu ada. Fitur lainnya bervariasi, dan dapat diakses melalui iloc[], melewati indeks kolom. Ini mengembalikan Series yang bisa kita gunakan dalam plot ini. Demikian pula, kita dapat mengakses nama kolom melalui indeks mereka juga โ€“ df.columns[index], yang digunakan untuk mengatur label sumbu Y.

Akhirnya, kami menambah/mengurangi penghitung dan panggilan plt.draw() untuk memperbarui Figure:

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Setelah kita mengklik Fitur Berikutnya tombol, fitur berikutnya dalam daftar kolom akan diplot melawan Alkohol, Dan Figure akan diperbarui dengan tepat โ€“ label, spidol, dan skala. Hal yang sama berlaku sebaliknya - Fitur Sebelumnya akan melintasi daftar dalam arah yang berlawanan, memungkinkan kita untuk berputar bolak-balik, dengan mekanisme keamanan yang mengatur ulang penghitung kita setiap kali kita mencapai akhir atau awal siklus.

Menambahkan Tombol Radio dan Kotak Centang

Tombol Radio digunakan untuk memungkinkan pengguna memilih satu nilai dari beberapa nilai. Hanya satu tombol radio yang dapat dipilih pada satu waktu, dan tombol tersebut biasanya mewakili sebuah pilihan. Kotak Centang dapat digunakan jika Anda ingin membiarkan pengguna memilih beberapa opsi sekaligus.

Catatan: Ada kemampuan yang sangat terbatas untuk memeriksa apakah kotak centang itu on or lepas. Faktanya, tidak ada yang keluar dari kotak. Anda hanya dapat memeriksa apakah kotak itu ditekan or tidak, yang menimbulkan batasan serius tentang bagaimana itu dapat digunakan karena kami tidak tahu di negara mana itu sebelumnya. Satu-satunya alternatif adalah menyimpan penghitung/pemeriksaan Anda sendiri untuk status kotak saat ini dengan boolean, dan ubah logika berdasarkan itu.

Ini akan memungkinkan Anda untuk, misalnya, menambahkan kotak centang untuk masing-masing argumen kustomisasi dari plot tertentu, memungkinkan pengguna untuk mengaturnya True or False (dicentang, atau tidak dicentang), atau pemetaan non-konflik lainnya berdasarkan status ini.

Padahal, karena API itu sendiri terbatas, kami akan membatasi diri pada penggunaan yang dimaksudkan juga โ€“ menghidupkan dan mematikan. Kami akan memiliki dua fitur, yang dapat kami ubah on dan lepas melalui Kotak centang. Perhatikan bahwa bahkan fungsi ini terbatas pada objek yang dapat Anda periksa apakah terlihat atau tidak.

Di sisi lain, kami tidak ingin mengizinkan pengguna untuk menerapkan dua skala sekaligus, atau untuk menetapkan dua batas-X sekaligus, karena hanya pernyataan yang disebut kedua dalam urutan yang akan diterapkan. Untuk ini โ€“ kami akan menggunakan Tombol Radio.

Mari tambahkan beberapa Tombol Radio untuk memungkinkan pengguna memilih rentang sumbu melalui beberapa Tombol Radio, tetapi juga memungkinkan mereka mengubah visualisasi fitur on dan lepas:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import CheckButtons
from matplotlib.widgets import RadioButtons fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv') # Plot two line plots for two features, and turn them invisible
line1, = ax.plot(df['fixed acidity'], visible=False)
line2, = ax.plot(df['citric acid'], visible=False) class EventHandler: # set_range handler def set_range(label): if (label == 'Small Range'): ax.set_xlim(0, 1600) ax.set_ylim(0, 25) else: ax.set_xlim(0, 1600) ax.set_ylim(0, 50) plt.draw() # Turn off, if on, and on if off def apply_features(label): if (label == 'Fixed Acidity'): line1.set_visible(not line1.get_visible()) elif (label == 'Citric Acid'): line2.set_visible(not line2.get_visible()) plt.draw() # Add radio buttons and checkboxes
ranges_ax = plt.axes([0.7, 0.02, 0.2, 0.1])
range_radio_buttons = RadioButtons(ranges_ax, ('Small Range', 'Large Range'))
range_radio_buttons.on_clicked(EventHandler.set_range) checkboxes_ax = plt.axes([0.4, 0.02, 0.25, 0.1])
checkboxes = CheckButtons(checkboxes_ax, ('Fixed Acidity', 'Citric Acid'))
checkboxes.on_clicked(EventHandler.apply_features) plt.show()

Sekali lagi, kami memiliki dua metode dalam EventHandler() kelas - set_range() dan apply_features(). itu set_range() metode mengatur rentang ke "kecil" atau "besar", dengan menyesuaikan Axes' X dan Y-batas. Itu apply_features() fungsi mengubah visible bidang Plot Garis yang kami buat sebelumnya, berdasarkan arusnya visible status. Jika visible == True, kami mematikan Line Plot, dan sebaliknya.

Kami harus mengandalkan kemampuan bawaan untuk memeriksa visibilitas Plot Garis, karena kami tidak dapat memeriksa apakah kotak centang dicentang atau tidak sebelumnya. Kemampuan yang sama ini dapat ditiru dengan status boolean dalam lingkup EventHandler() kelas, yang diatur ke True dan False pada setiap klik, untuk tipe plot yang tidak mendukung pemeriksaan apakah plot tersebut terlihat di luar kotak.

Menjalankan kode ini menghasilkan a Figure dengan dua set tombol di bagian bawah. Jika kita mencentang kedua kotak tersebut, kedua Plot Garis akan muncul:

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Kami dapat menonaktifkannya satu per satu:

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Dan kita dapat mengubah jangkauan Axes melalui Tombol Radio:

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Menambahkan Kotak Teks

kotak teks digunakan untuk mengumpulkan data dari pengguna โ€“ dan kami dapat mengubah plot berdasarkan data ini. Misalnya, kita dapat meminta pengguna untuk memasukkan nama fitur, atau menyisipkan fungsi untuk visualisasi plot kita. Tentu saja, bekerja dengan input pengguna bisa jadi rumit โ€“ selalu ada kasus tepi yang harus diwaspadai.

Mari kita menulis skrip yang memungkinkan pengguna untuk memasukkan a nama fitur dari kumpulan data, dan Axes pembaruan pada setiap pengiriman untuk mencerminkan masukan. Untuk kenyamanan pengguna, kami akan memberi tahu mereka jika input tidak dapat dicocokkan dengan nama kolom:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import TextBox fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv') class EventHandler: def submit(feature_name): if feature_name != "" or feature_name != None: if feature_name in df: ax.cla() ax.plot(df[feature_name]) else: if len(textbox_ax.texts) > 2: del textbox_ax.texts[-1] textbox_ax.text(-2, 0.4, feature_name + ' was not found.') plt.draw() textbox_ax = plt.axes([0.7, 0.02, 0.2, 0.1])
textbox = TextBox(textbox_ax, 'Feature Name')
textbox.on_submit(EventHandler.submit) plt.show()

Kami memiliki pemeriksaan sederhana untuk melihat apakah disediakan feature_name kosong atau None, dalam hal ini, kami tidak melakukan apa pun. Jika tidak, kami memeriksa apakah feature_name hadir dalam DataFrame, melampirkan pesan bahwa fitur tidak ditemukan jika tidak ada. Sebelum melampirkan teks, kita harus memastikan bahwa pesan sebelumnya dihapus, sehingga yang baru tidak tumpang tindih dengannya. Itu axes.texts properti adalah daftar semua Text contoh di Axes. Sejak Axes sudah memiliki Text misalnya, milik kami TextBox, kami tidak ingin menghapus apa pun jika ada 2 atau kurang Text contoh yang ada โ€“ pesan kesalahan dan TextBox label.

Jika di atas dua, kami sudah mendapat pesan kesalahan, yang harus dihapus.

Jika fitur is hadir di DataFrame, meskipun, kami menghapus Axes dan plotnya:

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Menambahkan Pemilih Rentang

Pemilih Rentang dapat digunakan untuk memungkinkan pengguna memilih rentang data dan fokus padanya, mengatur batas sumbu berdasarkan pilihan itu. Secara default, banyak perpustakaan mendukung fungsi ini, meskipun sayangnya, Matplotlib tidak dan kita harus melakukannya secara manual. Selain itu, kita harus menambahkan tambahan โ€œSetel ulangโ€ tombol jika kita mau zoom out juga.

Untuk menambahkan file Pemilih Rentang, kita tidak perlu mendedikasikan yang baru Axes untuk itu โ€“ kita dapat melampirkannya ke yang sudah ada, yang sangat masuk akal. Saat menghasilkan SpanSelector, kami menyediakan Axes itu milik, serta event handler, diikuti oleh 'horizontal' or 'vertical', yang memutar Axes dan Span Selector keduanya.

Grafik useblit argumen biasanya diatur ke True karena ini meningkatkan kinerja di sebagian besar backend. Selain itu, kami telah menambahkan beberapa properti gaya, seperti mengatur alpha dari persegi panjang yang dibuat sebagai Pemilih Rentang untuk 0.5 dan facecolor untuk yang bagus tab:blue:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('AmesHousing.csv') ax.scatter(x = df['Year Built'], y = df['Total Bsmt SF'], alpha = 0.6) class EventHandler: def select_horizontal(x, y): ax.set_xlim(x, y) plt.draw() def reset(self): ax.set_xlim(df['Year Built'].min(), df['Year Built'].max()) plt.draw span_horizontal = SpanSelector(ax, EventHandler.select_horizontal, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='tab:blue')) button_ax = plt.axes([0.7, 0.02, 0.2, 0.07])
button = Button(button_ax, 'Reset')
button.on_clicked(EventHandler.reset) plt.show()

Menjalankan ini menghasilkan plot di mana kita dapat memilih bentang dan memperbesarnya dengan mengatur Axes-limits ke nilai yang disediakan:

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Menambahkan Slider

Sliders memungkinkan pengguna untuk memilih di antara banyak nilai secara intuitif dengan menggeser penanda dan memilih nilai. Biasanya, penggeser digunakan untuk terus memperbarui beberapa nilai pada plot, seperti jangkauannya or bahkan fitur. Misalnya, Anda dapat menyesuaikan nilai konstanta melalui penggeser, yang selanjutnya memengaruhi fungsi yang bergantung pada konstanta tersebut.

Mari kita menulis skrip yang memungkinkan kita untuk mengubah batas sumbu Y dan X, melalui penggeser, yang memungkinkan kita mengubah perspektif dari mana kita melihat data kita:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2, left=0.2) df = pd.read_csv('winequality-red.csv')
plot, = ax.plot(df['volatile acidity']) class EventHandler: def update(val): ax.set_ylim(0, yslider.val) ax.set_xlim(0, xslider.val) plt.draw() xslider_ax = plt.axes([0.35, 0.03, 0.5, 0.07])
xslider = Slider( ax=xslider_ax, label="X-limit", valmin=0, valmax=len(df['volatile acidity']), valinit=len(df['volatile acidity']), orientation="horizontal"
) yslider_ax = plt.axes([0.03, 0.2, 0.07, 0.5])
yslider = Slider( ax=yslider_ax, label="Y-limit", valmin=0, valmax=3, valinit=1.5, orientation="vertical"
) xslider.on_changed(EventHandler.update)
yslider.on_changed(EventHandler.update) plt.show()

Kami telah menyesuaikan padding untuk memungkinkan penggeser di kiri dan bawah Axes, dan memplot Plot Garis sederhana. Menambahkan slider mengharuskan kita untuk membuat Axes untuk itu, seperti kebanyakan widget lainnya, dan tetapkan ke ax argumen dari Slider melalui konstruktor. Selain itu, kita dapat mengatur nilai minimum, maksimum dan awal dari slider. Ini biasanya akan menjadi rentang dinamis, berdasarkan data yang Anda plot, tetapi juga dapat secara manual mengatur nilai skalar.

Terakhir, Sliders dapat diorientasikan secara horizontal atau vertikal. Karena mereka dimaksudkan untuk terus diperbarui melalui gesek mouse โ€“ the on_changed() fungsi digunakan untuk memicu respons ketika pengguna memberikan input. Kami telah mengubah EventHandler kelas dengan update() fungsi yang hanya menyesuaikan nilai batas X dan Y berdasarkan value dari masing-masing slider.

Menjalankan kode ini akan menghasilkan plot dengan dua bilah geser, yang dapat kita gunakan untuk mengubah ruang lingkup Axes:

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Widget Matplotlib Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. ai.

Stempel Waktu:

Lebih dari penyalahgunaan