2017-08-22 3 views
1

私はPythonとmatplotlibのでは初心者です、大規模な検索が便利な何かをもたらすので、ここで行きませんでした:Python:バックグラウンドとして色分けした値を使って信号をプロットするにはどうすればよいですか?

私は、デバイスからdata(秒あたり256個のサンプル)後天います。 以下のコードは、データセットを再作成(およびプロット)します。

# Import modules 
import numpy as np 
import matplotlib.pyplot as plt 
# Set variable 
Fs = 256 
# Create list with random measurements 
np.random.seed(1) 
data = [np.random.uniform(-20000, 20000) for i in range(10*Fs)] 
#plt.plot(data, color = "black", linewidth = 0.3); plt.show() 
data

ために、私は毎秒、すなわち、256個のデータポイントの複数の値を計算しました。 1秒ごとにこれらの数字のセットが特徴です。 以下のコードは、これらの番号のうちの3つのデータセットを作成します(sig_val)。

# Create lists with random sig_values with length of 1/Fs of measurements 
sig_vals1 = [np.random.uniform(0, 1) for i in range(int(len(data)/Fs))] 
sig_vals2 = [np.random.uniform(0, 1) for i in range(int(len(data)/Fs))] 
sig_vals3 = [np.random.uniform(0, 1) for i in range(int(len(data)/Fs))] 

目標は、元datadataでオーバーレイの間隔約

  1. ヒートマップのような色分けされた情報を示すオーバーレイグラフ、
  2. を有することです。

https://ibb.co/iZcvWk

にはどうすればdataの背景としてsig_valsの色分けされた値の素敵なプロットを得るのですか?

+0

それはあなたが望むものとは異なって何をしているのですか?それはオーバーレイされていないということだけですか?あなたはプロットの間に閉じないことでそれを達成します。 – mauve

+0

@mauve:最初の 'plt.show()'と 'plt.plot(data)'の間に 'plt.close()'を使用しないと、オーバーレイが生成されません。 また、私は 'sig_vals1'を' sig_vals3''をバックグラウンドにしたいと考えています - スペクトログラムはデモンストレーションの目的にすぎませんでした。 – user7677771

+0

残念ながら、3つの信号がどのようにデータに関連しているのか、どのようにプロット上に表示されるべきかは不明です。私はspecgramに関する段落が助けよりも混乱していると思うでしょう(明らかにあなたはspecgramプロットを持っていないと思われます)。 「sig_vals1からsig_vals3をバックグラウンドとする」という意味はあなたには明らかですが、他の読者にとっては間違いありません。 – ImportanceOfBeingErnest

答えて

2

このような何かはあなたが後にしているものである可能性があります。両方のデータセットが同じ範囲の10秒間に分散されていることを前提としています。カラーコードへのシグナルは、3×10マトリックスで結合され、pcolormeshを使用してプロットすることができます。

import numpy as np 
import matplotlib.pyplot as plt 
# Set variable 
Fs = 256 
# Create list with random measurements 
np.random.seed(1) 
data = np.random.uniform(-20000, 20000, size=10*Fs) 
t = np.linspace(0,10,len(data)) 

sig_vals1 = np.random.uniform(0, 1, size=int(len(data)/Fs)) 
sig_vals2 = np.random.uniform(0, 1, size=int(len(data)/Fs)) 
sig_vals3 = np.random.uniform(0, 1, size=int(len(data)/Fs)) 
sig = np.c_[sig_vals1,sig_vals2,sig_vals3].T 

T, s = np.meshgrid(np.linspace(0,10,int(len(data)/Fs)+1),np.arange(4)) 


plt.pcolormesh(T,s,sig) 
plt.yticks(np.arange(.5,3,1), ["Signal{}".format(i+1) for i in range(3)]) 

ax2 = plt.gca().twinx() 
ax2.plot(t, data, color = "w", linewidth = 0.3, alpha=0.6) 
ax2.margins(0) 

plt.show() 

enter image description here

1

あなたの問題はスケール問題です...スペクトログラムをプロットすると、x軸は0〜8秒の範囲にあり、y軸はFs/2 = 128の範囲にあり、データが[ 20000:20000]、x軸は2560 ...というように、同じグラフにプロットするためにデータをスケールする必要があります。

あなたのような何かを行うことができます。重ねをプロットする方法をここで

# Import modules 
import numpy as np 
import matplotlib.pyplot as plt 
# Set variable 
Fs = 256 
# Create list with random measurements 
np.random.seed(1) 
data = [np.random.uniform(-20000, 20000) for i in range(10*Fs)] 
#plt.plot(data, color = "black", linewidth = 0.3); plt.show() 
# Create lists with random sig_values with length of 1/Fs of measurements 
sig_vals1 = [np.random.uniform(0, 1) for i in range(int(len(data)/Fs))] 
sig_vals2 = [np.random.uniform(0, 1) for i in range(int(len(data)/Fs))] 
sig_vals3 = [np.random.uniform(0, 1) for i in range(int(len(data)/Fs))] 

plt.specgram(data, Fs=Fs) #plot spectrogram 
t=[float(i)/Fs for i in range(10*Fs)] #create time vector 
data2=[((float(i)/40000)+0.5)*Fs/2 for i in data] # scale data between [0:128] to overlay spectrogram 
plt.plot(t, data2, color = "black", lw=0.3) # plot scaled data 
plt.show() 

しかし、多分それはサブプロットを作成し、元のデータを維持する方が良いでしょう:

ax1 = plt.subplot(211) 
plt.specgram(data, Fs=Fs) 
plt.specgram(data, Fs=Fs) 
plt.subplot(212) 
plt.plot(t, data, color = "black", lw=0.3) 
plt.show() 

編集: 使用imshow()

tot=[sig_vals1, sig_vals2,sig_vals3] 
t=[float(i)/Fs for i in range(10*Fs)] 
data2=[((float(i)/40000)+0.5)*2 for i in data] 
plt.plot(t, data2, color = "black", lw=0.3) 
plt.imshow(tot) 
plt.show() 
+1

ありがとうございました、私はあなたの答えの前に見ていなかった問題を解決しました。 は私の主な目標は、元の 'data'をかぶせ' sig_val'の間隔 約2 1.ヒートマップのような色分けされた情報を示し、オーバーレイグラフを持つことであることに注意してください。 – user7677771

+0

あなたの答えに感謝しますが、私の問題は解決しません。すべての 'sig_vals'を色分けされた背景として、' data'を上にプロットする方法が必要です。 – user7677771

+0

ああ、申し訳ありませんが、理解していませんでした...今あなたの投稿の編集がはるかに優れています。私のポストで編集を参照してください – Dadep

関連する問題