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

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

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

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

Q&A

解決済

1回答

1462閲覧

1つのプロットにグラフを複数重ねて表示したい

keisokukunn

総合スコア9

Python

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

0グッド

0クリップ

投稿2021/04/22 15:21

編集2021/04/23 05:11

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
現在、信号処理(FFT)のプログラムを作成しています。
グラフの出力において、n個(n=1,2,3,...)重ねて表示したいと思っているのですが、エラーメッセージが発生し、実行することが出来ません。
イメージ説明
例えば、図1↑のように5つに別々に表示されるのですが、
イメージ説明
図2↑のように表示したいです。

どなたかご教授して頂けると幸いです。

発生している問題・エラーメッセージ

IndexError Traceback (most recent call last) <ipython-input-9-64580a3bfb93> in <module> 56 57 plt.figure(figsize=(6,4)) ---> 58 plt.plot(fq[:int(N/2)+1],Data[n][:int(N/2)+1],color=color_list[j]) 59 plt.title(str(n)+"回目") 60 plt.xlabel("frequency[Hz]",fontsize=14) IndexError: invalid index to scalar variable.

該当のソースコード

Python

1import numpy as np 2import pandas as pd 3import os 4import matplotlib.pyplot as plt 5 6file_name = input("Please input filename:") 7 8Sampling_frequency = int(input("Please input Sampling_frequency: ")) 9 10Number_of_iterations = int(input("Please input Number_of_iterations:")) 11 12color_list=["black","gray","lightcoral","brown","darkred","red","tomato","sienna","sandybrown","darkorange","tan","gold","darkkhaki" 13 ,"yellowgreen","olivedrab","darkturquoise","lightblue" 14 ,"steelblue","cornflowerblue","navy","blue","indigo","darkviolet","purple","magenta","crimson","lightpink"] 15 16colorlist=len(color_list) 17 18#for j in range(0,colorlist): 19for n in range(1,Number_of_iterations+1): 20 for j in range(0,Number_of_iterations+1): 21 #データの読み込み 22 data=pd.read_csv(os.path.join(r"Z:/private/",file_name),header=None,usecols=list(range(1,n+1)),names=[f"{n}回目" for n in range(1,n+1)]) 23 24 #2次元配列から1次元配列に変更 25 data2=data[str(n)+"回目"].values 26 27 #データ数 28 N=len(data) 29 30 #サンプリング周波数 31 fs=Sampling_frequency 32 33 #窓関数 34 window=np.hamming(N) 35 36 #窓関数の補正値 37 acf=(1/(sum(window)/N)) 38 39 #時間軸のデータ作成 40 t=np.arange(0,N*(1/fs),1/fs) 41 42 #周波数軸のデータ作成 43 fq=np.linspace(0,fs,N) #周波数軸 linspace(開始,終了,分割数) 44 45 #窓関数後の信号 46 data_w=window*data2 47 48 #読み込んだデータをフーリエ変換 49 data_w_FFT=np.fft.fft(data_w) 50 51 #FFTの複素数結果を絶対値に変換 52 data_w_FFT_abs=abs(data_w_FFT) 53 54 #窓補正 55 Data=(data_w_FFT_abs)*acf 56 57 plt.figure(figsize=(6,4)) 58 plt.plot(fq[:int(N/2)+1],Data[n][:int(N/2)+1],color=color_list[j]) 59 plt.title(str(n)+"回目") 60 plt.xlabel("frequency[Hz]",fontsize=14) 61 plt.ylabel("signal intensity",fontsize=14) 62 plt.xlim(0,2000) 63 plt.show() 64 65#読み込んだデータの次元確認 66print("読み込んだデータの配列次元:\n"+str(data.ndim)) 67 68print("配列次元変更後:\n"+str(data2.ndim)) 69 70print("サンプリング周波数:\n"+str(fs)) 71 72print("サンプル数:\n"+str(N)) 73 74print("窓関数適用後のスペクトル補正値:\n"+str(acf)) 75 76print(Data)

試したこと

イメージ説明

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1 plt.plot(fq[:int(N/2)+1],Data[n][:int(N/2)+1],color=color_list[j])

は、

python

1 plt.plot(fq[:int(N/2)+1],Data[:int(N/2)+1],color=color_list[j])

の書き間違いではありませんか。

検証はしていませんが、以下のような感じで書けるはずです。
日本語のフォントの指定が必要ですので適当に入れてください。

python

1import numpy as np 2import pandas as pd 3import os 4import matplotlib.pyplot as plt 5 6file_name = input("Please input filename:") 7 8Sampling_frequency = int(input("Please input Sampling_frequency: ")) 9Number_of_iterations = int(input("Please input Number_of_iterations:")) 10color_list=["black","gray","lightcoral","brown","darkred","red","tomato","sienna","sandybrown","darkorange","tan","gold","darkkhaki" 11 ,"yellowgreen","olivedrab","darkturquoise","lightblue" 12 ,"steelblue","cornflowerblue","navy","blue","indigo","darkviolet","purple","magenta","crimson","lightpink"] 13data=pd.read_csv(os.path.join(r"Z:/private/",file_name),header=None,usecols=list(range(1,n+1)),names=[f"{n}回目" for n in range(1,n+1)]) 14 15#データ数 16N=len(data) 17#サンプリング周波数 18fs=Sampling_frequency 19#窓関数 20window=np.hamming(N) 21#窓関数の補正値 22acf=(1/(sum(window)/N)) 23#時間軸のデータ作成 24t=np.arange(0,N*(1/fs),1/fs) 25#周波数軸のデータ作成 26fq=np.linspace(0,fs,N) #周波数軸 linspace(開始,終了,分割数) 27 28fig = plt.figure(figsize=(6,4)) 29 30#for j in range(0,colorlist): 31for n in range(1,Number_of_iterations+1): 32# for j in range(0,Number_of_iterations+1): 33 #2次元配列から1次元配列に変更 34 data2=data[str(n)+"回目"].values 35 #窓関数後の信号 36 data_w=window*data2 37 #読み込んだデータをフーリエ変換 38 data_w_FFT=np.fft.fft(data_w) 39 #FFTの複素数結果を絶対値に変換 40 data_w_FFT_abs=abs(data_w_FFT) 41 #窓補正 42 Data=(data_w_FFT_abs)*acf 43 plt.plot(fq[:int(N/2)+1],Data[:int(N/2)+1],color=color_list[n],label=str(n)+"回目") 44 45plt.xlabel("frequency[Hz]",fontsize=14) 46plt.ylabel("signal intensity",fontsize=14) 47#plt.xlim(0,2000) 48plt.xlim(0,2) 49 50ax = fig.add_subplot(111) 51ax.legend() 52plt.show()

投稿2021/04/22 22:22

編集2021/04/23 14:38
ppaul

総合スコア24670

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

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

keisokukunn

2021/04/23 05:14

回答ありがとうございます。 plt.plot(fq[:int(N/2)+1],Data[:int(N/2)+1],color=color_list[j]) 上記のプログラムで行いますと、【試したこと】の画像のように、重ねて表示されず、各回数での色の違ったグラフが表示されてしまいます。 実現したいこと(図2)のように表示するにはどのようにしたらよいか、ご教授して頂けると幸いです。
ppaul

2021/04/23 14:38

回答に追加しました。 元データが分からないのでちゃんとした検証はしていません。
keisokukunn

2021/04/24 06:38

回答ありがとうございます! 実行してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問