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 Button
s, CheckButton
s, Slider
s, TextBox
es 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 False
bu 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
:
Düğmeye birkaç düzine kez bastıktan sonra, ax
rastgele işaretleyicilerle doldurulacaktır:
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
:
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:
Bunları ayrı ayrı kapatabiliriz:
Ve aralığını değiştirebiliriz Axes
Radyo Düğmeleri aracılığıyla:
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 None
bu 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 DataFrame
yine de temizliyoruz Axes
ve grafiğini çizin:
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:
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. Axes
ve 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, Slider
s 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
:
- erişim
- Türkiye
- Izin
- zaten
- Başka
- api
- yaklaşım
- argümanlar
- etrafında
- Başlangıç
- olmak
- kutu
- yerleşik
- çağrı
- hangi
- durumlarda
- değişiklik
- denetleme
- kod
- Sütun
- olabilir
- Çift
- Oluşturma
- akım
- Şu anki durum
- veri
- adanmış
- algılandı
- düzine
- dinamik
- kolayca
- kenar
- Etkinlikler
- olaylar
- örnek
- mükemmel
- Özellikler(Hazırlık aşamasında)
- Özellikler
- Ad
- odak
- bulundu
- işlev
- işlevsellik
- genel
- gidiş
- harika
- Yeşil
- sahip olan
- yardım et
- okuyun
- Ne kadar
- HTTPS
- Fikir
- Dahil olmak üzere
- indeks
- bütünleşme
- IT
- Etiketler
- büyük
- Sınırlı
- çizgi
- Liste
- Matris
- çoğu
- sayılar
- Opsiyonlar
- Diğer
- aksi takdirde
- performans
- perspektif
- mevcut
- basın
- süreç
- üretmek
- özellik
- radyo
- menzil
- RE
- yanıt
- Sonuçlar
- İade
- Güvenlik
- Adı geçen
- ölçek
- Ekran
- seçilmiş
- duyu
- set
- ayar
- Basit
- küçük
- So
- uzay
- başlama
- Eyalet
- Açıklama
- Devletler
- Durum
- arz
- destek
- Sistemler
- test
- İçinden
- zaman
- üst
- Güncelleme
- Güncellemeler
- us
- kullanıcılar
- değer
- Görüntüle
- görünürlük
- gözle görülür
- olup olmadığını
- olmadan
- işlenmiş
- çalışma
- yazı yazıyor
- X
- yıl
- yakınlaştırma