1. 程式人生 > 程式設計 >python中matplotlib實現隨滑鼠滑動自動標註程式碼

python中matplotlib實現隨滑鼠滑動自動標註程式碼

Python+matplotlib進行滑鼠互動,實現動態標註,資料視覺化顯示,滑鼠劃過時畫一條豎線並使用標籤來顯示當前值。

Python3.6.5,程式碼示例:

import matplotlib.pyplot as plt
import numpy as np
	
def Show(y):
	#引數為一個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')
	#標籤
	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() 
	#這個函式實時更新圖片的顯示內容
	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()

效果演示:

python中matplotlib實現隨滑鼠滑動自動標註程式碼

補充知識:matplotlib獲取滑鼠所在位置的axes

手頭的專案遇到一個問題,如何獲取滑鼠所在位置的axes對應的obspy.core.trace。在繪製axes時,我設定了一個數組用來儲存每一個trace所對應的axes,這樣比較方便繪製標籤。但我的專案需要對繪製的影象做放大縮小以及拖拽,這需要我單獨對一個axes來進行相應的操作。那麼如何通過axes來獲得對應的trace呢?我想了這幾個辦法:

1.設定一個hash表,記錄每一個axes與trace的對應情況,通過滑鼠操作傳入的event,可以得到當前axes的引用地址,以這個引用地址作為關鍵字查詢hash表,獲取對應trace。

2.通過axes引用地址定位到mpl的axes陣列,通過axes陣列的下標來訪問繪製時設定的陣列獲得trace。

3.獲取axes.label的內容,作為關鍵字去遍歷obspy.core.stream,獲取trace。

4.通過event獲取滑鼠位置,在結合畫布大小通過計算得到陣列下標,在訪問繪製時設定的陣列可以得到trace

前三種方法都不能保證一定能獲取到trace,並且有出錯的風險,但是如果可以實現,可靠性是大於最後一種,但是最後一種實現起來是最簡單的,明天我再思考如何通過matplotlib的滑鼠事件來獲取對應的trace

後來發現,可以採用第三種方法。訪問event.inaxes來獲得

以上這篇python中matplotlib實現隨滑鼠滑動自動標註程式碼就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。