Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Matplotlib Widget'ları

Matplotlib yalnızca statik grafikler için değildir. GUI'ler genellikle GUI kitaplıkları ve çerçeveleri ile oluşturulurken PyQT, Tkinter, kivi ve wxPythonPython'un PyQt ile mükemmel entegrasyonu olsa da Tkinter ve wxPython – bazı temel GUI işlevleri için bunlardan hiçbirini kullanmaya gerek yoktur. Matplotlib Widget'ları.

The matplotlib.widgets Modülün çeşitli sınıfları vardır, bunlar arasında AxesWidget, bunun dışında Buttons, CheckButtons, Sliders, TextBoxes vb. türetilmiştir. Bunların hepsi kabul ediyor Axes tek zorunlu kurucu argümanı olarak ekleniyorlar ve konumlarının manuel olarak ayarlanması gerekiyor. Dikkat edilmesi gereken bir nokta şu ki widget eksenlerdir, böylece bir Axes her widget için örnek.

Dikkat edilmesi gereken bir diğer husus ise widget'lara referansları tutmalısınız aksi halde çöp toplanabilir.

Her biri ayrıca ayarlanarak devre dışı bırakılabilir. active için Falsebu durumda, tıklanma gibi hiçbir olaya yanıt vermezler. Bununla birlikte, çeşitli GUI öğeleri ve bileşenleri aracılığıyla olay örgülerimize yeni bir etkileşim türü sunabiliriz.

Not: Matplotlib'in yüksek kaliteli GUI oluşturma veya kullanıcı dostu sistemler için kullanılması amaçlanmamıştır. Bu widget'lar ilkeldir, gerçekten harika görünmezler ve sınırlı işlevselliğe sahiptirler. Bunları gerçekten göndermek yerine prototiplemenin ve test etmenin bir yolu olarak düşünülüyorlar.

Daha önce PyQt ile çalıştıysanız, bu widget'ları eklemenin yanı sıra bunları olay işleyicilerine bağlamaya ilişkin genel söz dizimi ve yaklaşımın oldukça tanıdık olduğunu fark edebilirsiniz.

Düğme Ekleme

ile başlayalım düğmeler - matplotlib.widgets modül bir tanımlar Button sınıf. Ona bağlanmak için, on_clicked() Sağladığımız işlevi yürüten işlev. Bir tıklama algılandığında işlev yürütülür.

Buton oluştururken bir atama yapıyoruz. Axes konumlandırma için kullanılır. Ayrıca bir label o zaman, bir miktar metin eklemek ve kullanıcı için buna açıklama eklemek için. color ve hovercolor bağımsız değişkenler, düğmenin üzerine gelinmeden önceki ve sonraki rengini tanımlar.

Tüm widget'ların konumu ve alanıyla biz ilgilendiğimiz için, hadi bir Figure ve Axes, bir düğme eklemek için altta bir miktar boşluk bırakın ve boş bir Dağılım Grafiği çizin. Daha sonra, bir tanımlayacağız EventHandler tek bir metodu olan sınıf add_random(). Yöntem iki rastgele sayı üretir ve bunlar için bir işaretleyici çizer. Axes daha önce oluşturduk ve çağrılar yaptık plt.draw()yeniden çizen Figure. Arsaları güncellerken her zaman aramamız gerekecek plt.draw() gerçekten güncellemek için tekrar:

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()

Bu bir Figure, boş bir Axes içinde ve ekranın sağ üst köşesinde kendi içinde bir düğme Axes:

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Düğmeye birkaç düzine kez bastıktan sonra, ax rastgele işaretleyicilerle doldurulacaktır:

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Daha pratik anlamda, şöyle bir şey yaratabiliriz: devir Her düğmeye basıldığında çizilecek özellikler. Bu, birkaç ayarlama gerektirir EventHandler, ayrıca bu döngüye geri dönmek için başka bir düğme.

Kullanalım Kırmızı Şarap Kalitesi veri kümesini tekrar seçin ve çeşitli özellikleri görselleştirin. Alkol özellik. Çünkü bir özelliği diğerine göre çizmek için kod yazarak ve ardından başka bir özelliği diğerine göre çizmek için bu kodu değiştirerek bunları tek tek çizmekle uğraşamayız.

Bir Dağılım Matrisi oluşturmak burada bize yardımcı olabilir, ancak veri kümesinin çok sayıda özelliği varsa, oldukça okunamaz hale gelir ve fazla uzaklaşamayız. Eğer sahip olmak istersen her ikisi de Kolayca görüntüleyip yorumlayabileceğiniz büyük ölçekli araziler, de fazladan çaba harcamadan birden fazla özelliğin geçiş yapması nedeniyle bu işlemi düğmelerle otomatikleştirebilirsiniz:

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()

The EventHandler sınıfın artık iki yöntemi var – next_feature() ve previous_feature(). Bunların her ikisi de sayacın olup olmadığını kontrol eder. i Sütun listesinin sonuna veya başına ulaşıldığında ve IndexError, endeksi ters değere sıfırlarız ve bir simüle ederiz devir. Aşağıya iniyorum 0 bizi eskiye geri götürecek son sütun listesinin üzerine gideriz ve son sütunun üstüne çıkmak bizi ilkine geri döndürür.

Nerede olduğumuzu tespit ettikten sonra Temizle Axes, çünkü mevcut bir grafiği temizlemeden yeniden çizim yapacağız. cla() (clkulak axes). Alternatif olarak özellik ilişkilerini de üst üste çizerek yığabilirsiniz ve cla() Döngünün sonunda/başlangıcında indeks sıfırlanırken kullanılan ifade.

Temizledikten sonra Axes – boyamak için temiz bir tuvalimiz var ax.scatter() işlev. Bu örnekte sabit özellik şu şekildedir: Alkolyani her zaman mevcuttur. Diğer özellik değişiklik gösterir ve şu adresten erişilebilir: iloc[], sütunun dizinini geçerek. Bu bir döndürür Series bu çizimde kullanabiliriz. Benzer şekilde erişebiliriz sütun adları aynı zamanda kendi endeksleri aracılığıyla – df.columns[index]Y ekseni etiketini ayarlamak için kullanılır.

Son olarak sayacı artırıp/azaltıyoruz ve çağırıyoruz plt.draw() güncellemek için Figure:

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Bir kez tıkladığımızda Sonraki Özellik düğmesi, sütun listesindeki bir sonraki özelliğin grafiğini çizecektir. Alkol, Ve Figure etiketler, işaretçiler ve ölçek uygun şekilde güncellenecektir. Aynı şey tersi için de geçerli - Önceki Özellik listeyi ters yönde geçerek döngünün sonuna veya başına her geldiğimizde sayacımızı sıfırlayan bir güvenlik mekanizmasıyla ileri geri döngü yapmamıza olanak tanıyacak.

Radyo Düğmeleri ve Onay Kutuları Ekleme

Radyo Düğmeleri kullanıcının seçim yapmasına izin vermek için kullanılır tek değer / çeşitli değerler. Aynı anda yalnızca bir radyo düğmesi seçilebilir ve bunlar genellikle bir seçeneği temsil eder. Onay Kutuları Kullanıcının aynı anda birden fazla seçeneği seçmesine izin vermek istiyorsanız kullanılabilir.

Not: Bir onay kutusunun olup olmadığını kontrol etme yeteneği çok sınırlıdır. on or kapalı. Aslında kutunun dışında hiçbir şey yok. Yalnızca kutunun olup olmadığını kontrol edebilirsiniz. preslenmiş or değil, bundan önce hangi durumda olduğu hakkında hiçbir fikrimiz olmadığından, nasıl kullanılabileceği konusunda ciddi bir sınırlama teşkil ediyor. Tek alternatif, kutunun mevcut durumuna ilişkin kendi sayacınızı/kontrolünüzü bir boole ile tutmak ve buna göre mantığı değiştirmektir.

Bu, örneğin her biri için bir onay kutusu eklemenizi sağlar. özelleştirme argümanı kullanıcının bunları ayarlamasına olanak tanıyan belirli bir arsanın True or False (işaretli veya işaretsiz) veya bu durumlara dayalı diğer çakışmayan eşlemeler.

Ancak API'nin kendisi sınırlı olduğundan, kendimizi amaçlanan kullanımla da sınırlayacağız; yani bazı şeyleri açıp kapatacağız. Döndürebileceğimiz iki özelliğimiz olacak on ve kapalı bir Onay Kutusu aracılığıyla. Bu işlevselliğin bile görünür olup olmadıklarını kontrol edebileceğiniz nesnelerle sınırlı olduğunu unutmayın.

Öte yandan, kullanıcının aynı anda iki ölçek uygulamasına veya aynı anda iki X limiti ayarlamasına izin vermek istemiyoruz çünkü yalnızca dizide ikinci olarak adlandırılan ifade uygulanacaktır. Bunlar için Radyo Düğmelerini kullanırdık.

Kullanıcının eksen aralığını birkaç Radyo Düğmesi aracılığıyla seçmesine izin vermek ve aynı zamanda özellik görselleştirmelerini değiştirmesine de izin vermek için birkaç Radyo Düğmesi ekleyelim. on ve kapalı:

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()

Yine iki yöntemimiz var EventHandler() sınıf - set_range() ve apply_features(). set_range() yöntemi, aralığı "küçük" veya "büyük" olarak ayarlar. Axes' X ve Y sınırları. apply_features() işlevi değiştirir visible daha önce yaptığımız Hat Grafiklerinin mevcut durumlarına göre alanı visible durum. Eğer visible == True, Çizgi Grafiği'ni kapatırız ve bunun tersi de geçerlidir.

Onay kutusunun daha önce işaretlenip işaretlenmediğini kontrol edemediğimiz için Çizgi Grafiklerinin görünürlüğünü kontrol etmek için yerleşik yeteneğe güvenmemiz gerekiyor. Bu aynı yetenek bir şeyle taklit edilebilir. status kapsamında boolean EventHandler() olarak ayarlanmış sınıf True ve False Kutunun dışında görünür olup olmadıklarının kontrol edilmesini desteklemeyen çizim türleri için her tıklamada.

Bu kodu çalıştırmak bir sonuçla sonuçlanır Figure altta iki takım düğme bulunur. Her iki onay kutusunu da işaretlersek, her iki Çizgi Grafiği de görünecektir:

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Bunları ayrı ayrı kapatabiliriz:

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Ve aralığını değiştirebiliriz Axes Radyo Düğmeleri aracılığıyla:

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Metin Kutuları Ekleme

Metin kutuları alışkın toplamak kullanıcıdan gelen veriler - ve grafikleri bu verilere göre değiştirebiliriz. Örneğin, kullanıcıdan bir özelliğin adını girmesini veya grafiğimizin görselleştireceği bir işlev eklemesini isteyebiliriz. Elbette kullanıcı girdileriyle çalışmak zor olabilir; her zaman dikkat edilmesi gereken uç durumlar vardır.

Kullanıcının bir giriş yapmasına izin veren bir komut dosyası yazalım. özellik adı bir veri kümesinin ve Axes girişi yansıtacak şekilde her gönderimde güncellemeler. Kullanıcıya kolaylık sağlamak amacıyla, girişin bir sütun adıyla eşleştirilememesi durumunda bunu onlara bildireceğiz:

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()

Sağlanıp sağlanmadığını görmek için basit bir kontrolümüz var. feature_name boş veya Nonebu durumda hiçbir şey yapmayız. Değilse, olup olmadığını kontrol ederiz. feature_name içinde mevcut DataFrame, mevcut değilse özelliğin bulunamadığına dair bir mesaj ekleyerek. Ancak metni eklemeden önce, yeni mesajın onunla çakışmaması için önceki mesajın kaldırıldığından emin olmalıyız. axes.texts özellik tüm özelliklerin bir listesidir Text örnekler bir Axes. Beri Axes zaten var Text mesela bizimkine ait TextBox, eğer 2 veya daha az varsa hiçbir şeyi kaldırmak istemiyoruz Text mevcut örnekler – hata mesajı ve TextBox etiket.

Eğer ikinin üzerindeyse, zaten kaldırılması gereken bir hata mesajımız var demektir.

Özellik is içinde mevcut DataFrameyine de temizliyoruz Axes ve grafiğini çizin:

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Aralık Seçicileri Ekleme

Aralık Seçiciler kullanıcının bir veri aralığını seçmesine ve ona odaklanmasına, eksen sınırlarını bu seçime göre ayarlamasına olanak sağlamak için kullanılabilir. Varsayılan olarak birçok kütüphane bu işlevselliği desteklemektedir, ancak ne yazık ki Matplotlib bunu desteklememektedir ve bunu manuel olarak yapmamız gerekecek. Ek olarak bir tane daha eklememiz gerekecek "Reset" Eğer istersek düğmeye uzaklaştırmak gibi.

Eklemek için Aralık Seçicitamamen yeni bir bölüm ayırmamıza gerek yok Axes bunun için onu mevcut olana ekleyebiliriz ki bu da çok mantıklıdır. Bir oluştururken SpanSelector, biz tedarik ediyoruz Axes olay işleyicisinin yanı sıra aittir ve ardından 'horizontal' or 'vertical', döndüren Axes ve Span Seçici her ikisi de.

The useblit argüman genellikle şu şekilde ayarlanır: True çünkü çoğu arka uçta performansı artırır. Ayrıca, ayarlama gibi birkaç stil özelliği de ekledik. alpha Yayılma Seçicisi olarak oluşturulan dikdörtgenin 0.5 ve facecolor güzel bir 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()

Bunu çalıştırmak, Eksen sınırlarını sağlanan değerlere ayarlayarak açıklıkları seçebileceğimiz ve yakınlaştırabileceğimiz bir çizim oluşturur:

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Kaydırıcılar Ekleme

Sliders kullanıcıların bir işaretçiyi kaydırarak ve bir değer seçerek birçok değer arasından sezgisel olarak seçim yapmasına olanak tanır. Tipik olarak kaydırıcılar, bir grafik üzerindeki aralık gibi bazı değerleri sürekli olarak güncellemek için kullanılır. or bir özellik bile. Örneğin, bir sabitin değerini bir kaydırıcı aracılığıyla ayarlayabilirsiniz; bu da o sabite dayanan bir işlevi etkiler.

Bir kaydırıcı aracılığıyla Y ve X ekseni sınırlarını değiştirmemize olanak tanıyan ve verilerimizi görüntülediğimiz perspektifi değiştirmemize olanak tanıyan bir komut dosyası yazalım:

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()

Dolguyu, ekranın solunda ve altında kaydırıcıya izin verecek şekilde ayarladık. Axesve basit bir Çizgi Grafiği çizdim. Kaydırıcı eklemek, bir Axes diğer birçok widget'ta olduğu gibi bunun için de onu atayın. ax tartışması Slider yapıcı aracılığıyla. Ayrıca kaydırıcının minimum, maksimum ve başlangıç ​​değerlerini de ayarlayabiliriz. Bunlar genellikle çizdiğiniz verilere bağlı olarak dinamik aralıklar olacaktır ancak skaler değerler manuel olarak da ayarlanabilir.

En sonunda, Sliders yatay veya dikey olarak yönlendirilebilir. Bir fare kaydırmasıyla sürekli olarak güncellenmeleri amaçlandığından, on_changed() işlevi, bir kullanıcı girdi verdiğinde bir yanıtı tetiklemek için kullanılır. Biz ayarladık EventHandler olan sınıf update() X ve Y limitlerinin değerlerini basit bir şekilde ayarlayan fonksiyon valİlgili kaydırıcılardan yararlanın.

Bu kodu çalıştırmak, kapsamını değiştirmek için kullanabileceğimiz iki kaydırıcılı bir çizim üretecektir. Axes:

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Matplotlib Widget'ları PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Zaman Damgası:

Den fazla Yığın kötüye kullanımı