python中matplotlib實現(xiàn)隨鼠標(biāo)滑動自動標(biāo)注代碼
Python+matplotlib進(jìn)行鼠標(biāo)交互,實現(xiàn)動態(tài)標(biāo)注,數(shù)據(jù)可視化顯示,鼠標(biāo)劃過時畫一條豎線并使用標(biāo)簽來顯示當(dāng)前值。
Python3.6.5,代碼示例:
import matplotlib.pyplot as plt import numpy as np def Show(y): #參數(shù)為一個list len_y = len(y) x = range(len_y) _y = [y[-1]]*len_y fig = plt.figure(figsize=(960/72,360/72)) ax1 = fig.add_subplot(1,1,1) ax1.plot(x, y, color='blue') line_x = ax1.plot(x, _y, color='skyblue')[0] line_y = ax1.axvline(x=len_y-1, color='skyblue') ax1.set_title('aaa') #標(biāo)簽 text0 = plt.text(len_y-1,y[-1],str(y[-1]),fontsize = 10) def scroll(event): axtemp=event.inaxes x_min, x_max = axtemp.get_xlim() fanwei_x = (x_max - x_min) / 10 if event.button == 'up': axtemp.set(xlim=(x_min + fanwei_x, x_max - fanwei_x)) elif event.button == 'down': axtemp.set(xlim=(x_min - fanwei_x, x_max + fanwei_x)) fig.canvas.draw_idle() #這個函數(shù)實時更新圖片的顯示內(nèi)容 def motion(event): try: temp = y[int(np.round(event.xdata))] for i in range(len_y): _y[i] = temp line_x.set_ydata(_y) line_y.set_xdata(event.xdata) ###### text0.set_position((event.xdata, temp)) text0.set_text(str(temp)) fig.canvas.draw_idle() # 繪圖動作實時反映在圖像上 except: pass fig.canvas.mpl_connect('scroll_event', scroll) fig.canvas.mpl_connect('motion_notify_event', motion) plt.show()
效果演示:
補充知識:matplotlib獲取鼠標(biāo)所在位置的axes
手頭的項目遇到一個問題,如何獲取鼠標(biāo)所在位置的axes對應(yīng)的obspy.core.trace。在繪制axes時,我設(shè)置了一個數(shù)組用來保存每一個trace所對應(yīng)的axes,這樣比較方便繪制標(biāo)簽。但我的項目需要對繪制的圖像做放大縮小以及拖拽,這需要我單獨對一個axes來進(jìn)行相應(yīng)的操作。那么如何通過axes來獲得對應(yīng)的trace呢?我想了這幾個辦法:
1.設(shè)置一個hash表,記錄每一個axes與trace的對應(yīng)情況,通過鼠標(biāo)操作傳入的event,可以得到當(dāng)前axes的引用地址,以這個引用地址作為關(guān)鍵字查找hash表,獲取對應(yīng)trace。
2.通過axes引用地址定位到mpl的axes數(shù)組,通過axes數(shù)組的下標(biāo)來訪問繪制時設(shè)置的數(shù)組獲得trace。
3.獲取axes.label的內(nèi)容,作為關(guān)鍵字去遍歷obspy.core.stream,獲取trace。
4.通過event獲取鼠標(biāo)位置,在結(jié)合畫布大小通過計算得到數(shù)組下標(biāo),在訪問繪制時設(shè)置的數(shù)組可以得到trace
前三種方法都不能保證一定能獲取到trace,并且有出錯的風(fēng)險,但是如果可以實現(xiàn),可靠性是大于最后一種,但是最后一種實現(xiàn)起來是最簡單的,明天我再思考如何通過matplotlib的鼠標(biāo)事件來獲取對應(yīng)的trace
后來發(fā)現(xiàn),可以采用第三種方法。訪問event.inaxes來獲得
以上這篇python中matplotlib實現(xiàn)隨鼠標(biāo)滑動自動標(biāo)注代碼就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中datetime模塊中strftime/strptime函數(shù)的使用
這篇文章主要介紹了python中datetime模塊中strftime/strptime函數(shù)的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07Jupyter Notebook添加代碼自動補全功能的實現(xiàn)
這篇文章主要介紹了Jupyter Notebook添加代碼自動補全功能的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python使用JSON庫解析JSON數(shù)據(jù)的方法
這篇文章主要介紹了Python使用JSON庫解析JSON數(shù)據(jù),主要包括如何在網(wǎng)頁中獲取json數(shù)據(jù)及python內(nèi)置的json庫,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06Python使用requests庫發(fā)送請求的示例代碼
與原生的urllib庫相比,requests庫提供了更簡潔、易于理解和使用的API,使發(fā)送HTTP請求變得更加直觀和高效,所以本文給大家介紹了Python如何使用requests庫發(fā)送請求,需要的朋友可以參考下2024-03-03python 讀寫csv文件方式(創(chuàng)建,追加,覆蓋)
這篇文章主要介紹了python 讀寫csv文件方式(創(chuàng)建,追加,覆蓋),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05