Selamlar. Python projelerinde kullandığım, veri görselleştirme işlemleri için muhteşem çözümler sunan matplotlib de kullandığım mpldatacursor modülü ile bazı sorunlar yaşamaya başladım. Bunun için bu modülü matplotlib in annotation sınıfıyla gerçekleştirmek için kolları sıvadım. İki günlük çalışma sonucu nihayete erdirdim.
Mpldatacursor bir çeşit bilgilendirme ekranı özelliği sağlıyor. Matplotlib üzerindeki herhangi bir nesneyi mouse ile seçtiğinizde, istenilen bilgileri yanında görmemize olanak sağlıyor. Grafikte, haritada interaktif sunumlar hazırlayabiliyorsunuz. Alt yapısında nasıl çalıştığına fazlaca takılmadan alıp kullanmıştım. Aşağıda basit bir kullanım örneği görmektesiniz.
Bazı problemler yaşamaya başlayınca altta neler olduğunu, nasıl yapabileceğimi araştırmaya başladım. Matplotlib in annotation sınıfıyla yapabileceğini gördüm. Annotation sınıfının benzer işlevi vardı. Şimdi yapmam gereken grafik üzerindeki nesneyi mouse ile seçebilmek, daha sonra annotation ile bilgiyi göstermek, sonrada eğer istenirse kapatmak olarak sıralayabileceğim bir planda işlemi gerçekleştirmekti. Şimdi adım adım kod satırlarının yanına açıklamalarını yazarak gerçekleştirelim.
- Matplotlib ile grafik oluşturmak için önce yapılması gereken bir veri seti oluşturmaktır. . Bu verileri oluşturmak için numpy modülünü kullanalım. Sonra bu verileri gösterelim.
123xVal=np.arange(0,5) # 5elemanlı dizi oluşturyVal=np.random.randint(0,100,5)#0 ile 100 arasında rastgele sayılardan oluşan 5 elemanlı dizi oluşturstrVal=np.array(['1881','1919','1920','1923','1938'])#string verilerden oluşan 5 boyutlu bişr numpy array-Text verilerimiz
- Matplotlib üzerinde mouse yada keyboard eventleri için mpl_connect sınıfı kullanılmakta. Burada pick_event olayı tetiklenmektedir. Unutmamak gerekirki pick eventin çalışması için “pick” lenecek nesnenin picker parametresine true ya da bir değer atanması gerekir. Önce matplotlib için gerekli olan tanımlamaları yapalım.
1 |
fig, ax = plt.subplots()# plt dan yararlanarak bir ax ve bir fig oluşturuluyor. Grafiğimiz bunlardan oluşacak. |
- Pick_event fonksiyonunu hazırlayalım.
12345678910def on_pick(event):print("Mouse x:{} y:{} button:{}".format(event.mouseevent.xdata,event.mouseevent.ydata,event.mouseevent.button))#seçimde tetiklenecek olan olayın mouse koordinatları ve tıklanan butonif(isinstance(event.artist,PathCollection)):#seçilmiş olan nesne eğer pathCollectionsa (scatter pathcollection olarak kalıtım alır)print (xVal[event.ind], "clicked")#seçilen nesnenin index idataCursorTextVal=strVal[event.ind][0]#seçilen nesne için index den yararlanarak text seçiliyor.dataCursorLocation=event.mouseevent.xdata+0.5,event.mouseevent.ydata+0.5#dataCursorun görüneceği yerdataCursorTargetLocation=event.mouseevent.xdata,event.mouseevent.ydata#datacursorun bnağlandığı konum,ok un ucuz=plt.annotate(dataCursorTextVal,dataCursorTargetLocation, dataCursorLocation, 'data',arrowprops=dict(arrowstyle="-|>", connectionstyle="arc3,rad=0.3",lw=1,edgecolor='black'),bbox=dict(facecolor='yellow', edgecolor='black',boxstyle='round,pad=0.5',alpha=0.5),size=6, ha="center")box.append(z)#silme işlemi için referans için listeye atılıyorbox[box.__len__()-1].draggable()#tut-taşı özelliği aktif ediliyor. - Datacursorleri silme/kapatma işlemi için ise keypres eventini kullanacağız. Bu event e bağlanmak için bir fonksiyon yazalım.
12345def on_key(event):for i in box:#her box içeriği içini.remove()#remove işlemini yapbox.clear()#referans için tutulan diziyi boşalt. Zaten silindifig.canvas.draw()#cancvas ı tekrar çiz
- Son olarak tüm bu olayları bağlayalım.
123fig.canvas.mpl_connect('pick_event', on_pick)#on_pick i canvasın onpick evenmtine bağla. Bir nesne seçildiğinde bu fonksiyon çalışsıncid = fig.canvas.mpl_connect('key_press_event', on_key)#klavye de bir tuşa basıldığında on_key fonksiyonu çalışsınplt.show()
Sonuç olarak aşağıdaki foto da görülen bir pencereye sahip olacağız ve klavyeden bir tuşa bastığımızda datacursor lerin hepsi kaldırılacak.
Kodların tamamına ulaşmak için gitlab adresini ziyaret edebilirsiniz. Kalın sağlıcakla..