質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

846閲覧

matplotlibの図中のクリックを反映させたい

tsuji__

総合スコア11

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/06 07:25

前提・実現したいこと

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

結果の図イメージ説明
上図内部でクリックすることによってクリック位置のX値(周波数)が表示されるイメージです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問