前提・実現したいこと
PythonのmatplotlibでFFT変換の結果を表示して、図中の任意の位置をクリックした際にそのX座標(周波数)の値が分かるプログラムを作成しています。
#発生している問題・エラーメッセージ
図自体は出るのですが、図中でクリックを押しても何も反映されていません。
エラーメッセージというか警告が以下のように出ました。
Python
1MatplotlibDeprecationWarning: 2The matplotlib.backends.backend_qt4agg backend was deprecated in Matplotlib 3.3 and will be removed two minor releases later. 3 return _bootstrap._gcd_import(name[level:], package, level)
該当のソースコード
Python
1# -*- coding: utf-8 -*- 2 3import matplotlib 4matplotlib.use('Qt4Agg') 5import numpy as np 6import matplotlib.pyplot as plt 7import scipy.io 8import wave_statistics as ws 9import pylab 10from sklearn.decomposition import PCA 11import pandas as pd 12from scipy import fftpack 13from scipy import signal 14 15def FFTparameter(Fs,N): 16 17 fmax=int(Fs/2.56) 18 Line=int(N/2.56) 19 dt=1/Fs 20 df=fmax/Line 21 t=np.arange(0,N*dt,dt) 22 freq=np.linspace(0,fmax,Line) 23 return fmax,Line,dt,df,t,freq 24 25def ov_FFT(data,Fs,N,overlap,window): 26 27 Ts = len(data) / Fs 28 Fc = N / Fs 29 x_ol = N * (1 - (overlap/100)) 30 N_ave = int((Ts - (Fc * (overlap/100))) / (Fc * (1-(overlap/100)))) 31 array = [] 32 if window=='hann': 33 window=np.hanning(N) 34 elif window=='rec': 35 window=signal.boxcar(N) 36 elif window=='flattop': 37 window=signal.flattop(N) 38 for i in range(N_ave): 39 ps = int(x_ol * i) 40 array.append(data[ps:ps+N:1]) 41 array_window=array*window 42 F = fftpack.fft(array_window) 43 Famp=np.abs(F) 44 F_total=np.sum(Famp,axis=0) 45 F_average=F_total / N*2 46 F_average=F_average/N_ave 47 acf=1/(sum(window)/N) 48 F_average=acf*F_average 49 return F_average, N_ave 50 51def oncpaint(event): 52 if event.button==1: 53 ind = np.searchsorted(x,event.xdata) 54 plt.title("You clicked index="+str(ind)) 55 ax.plot([x[ind]],[y[ind]], ".", color="red",markersize=15) 56 fig.canvas.draw() 57 print('x=%f, y=%f' %(x[ind], y[ind])) 58 59sample_0=scipy.io.loadmat('sample_data/105.mat') 60sample_0_mag=sample_0['X105_FE_time'].reshape(-1) 61del(sample_0) 62 63fmax,Line,dt,df,t,freq=FFTparameter(12000, 24000) 64 65speq,N_ave=ov_FFT(sample_0_mag, 12000, 24000, 0, 'hann') 66 67 68x=freq[0:Line] 69y=speq[0:Line] 70 71fig, ax = plt.subplots() 72plt.plot(x,y) 73cid = fig.canvas.mpl_connect('button_press_event', oncpaint) 74plt.show() 75 76
試したこと
以下サイトを検索して試してみましたが、いずれの方法でもクリックが反映されませんでした。
https://qiita.com/ceptree/items/c9239ce4e442482769b3
https://qiita.com/HajimeKawahara/items/abc24fa2216009523656
補足情報(FW/ツールのバージョンなど)
環境
Spyder (Python3.8)
matplotlib=3.3.2
numpy=1.19.2
あなたの回答
tips
プレビュー