Python:如何将带有颜色编码值的信号绘制为背景?

时间:2017-08-22 17:30:59

标签: python matplotlib signals overlay colormap

我是Python和matplotlib的初学者,广泛的搜索没有产生任何有用的东西,所以这里有:

我从设备获得了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个数据点。每一秒都有一组这些数字。 下面的代码将为其中3个数字创建一个数据集,称为sig_val s。

# 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))]

目标是制作一个显示

的叠加图
  1. 关于data间隔的热图类彩色编码信息,
  2. 与原始data重叠。
  3. https://ibb.co/iZcvWk

    如何将sig_vals的颜色编码值作为data的背景?

2 个答案:

答案 0 :(得分:2)

这样的事情可能就是你所追求的。它假设两个数据集都在10秒的相同范围内展开。彩色编码信号以3×10矩阵连接,可以使用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() 绘制。

    function show(){
        $("#example").DataTable({
            serverSide: true,
            processing: true,       
            columns : [
                { data : 'FirstName' },
                { data : 'LastName' }
            ],    
            ajax: {
                url: "https://api.myjson.com/bins/384sr",
                dataSrc : ''
           }
        });  
   }
   show();

enter image description here

答案 1 :(得分:1)

你的问题是一个尺度问题...当你绘制谱图时,x轴在0-8秒范围内,y轴在Fs / 2 = 128范围内,当你的数据在[-20000:对于y轴为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()