44659


波形グラフとスペクトログラムの図を上下に並べた図を作成したいと思っています。

例えは、0時、1時、2時の1時間ごとのデータファイルがあり、これをｘ軸が0：00－3：00となるようなグラフとして出力する場合、3つのファイルをひとつにマージして、作成するという方法もあろうかと思いますが、これをやると、specgramの計算でメモリエラーとなってしまいました。（サンプルコードではエラーになりませんが、実際使用しているデータはデータ数が膨大なため、エラーが発生してしまいます）  
そこで、0時のファイルを読んで計算、1時のファイルを読んで計算、、、という風にすればよいのではと考えてやってみましたが、うまくいきません。（スペクトログラムの図が、最後に読み込んだファイルの図になってしまいます）  
なにか良い方法はないでしょうか。初心者です。よろしくお願いします。

[code]

    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    import numpy as np
    import pandas as pd
    
    start_h = 0
    end_h = 3
    
    fig = plt.figure(figsize=(6,4))
    
    
    start_hh = '%02d' % start_h #zero padding
    end_hh = '%02d' % end_h
    
    i = start_h
    
    while i < end_h:
    
        hour = '%02d' % i 
        hour_plus1 = '%02d' % (i+1)
    
        #xデータ生成： 02018-01-01 **:00:00から1秒毎にデータを生成(3600-1個生成）
        x= pd.date_range('2018-01-01 ' + hour + ':00:00',periods=3600-1,freq='S')
    
        #yデータ生成： 0から(i+1)*10の間で乱数を発生させて3600-1要素(1Hz 1時間)のリストを生成
        y = np.random.randint(0,(i+1)*10,3600-1)
    
        #plot waveform
        plt.axes([0.1, 0.75, 0.7, 0.2])
        plt.plot(x,y)
        plt.xlim('2018-01-01 ' + start_hh + ':00:00', '2018-01-01 ' + end_hh + ':00:00')
        plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
    
        #plot spectrogram
        plt.axes([0.1, 0.1, 0.7, 0.55])
        Pxx, freqs, bins, im = plt.specgram(y, Fs=1,scale='dB')
    
        i= i+1
    
    #plot colorbar
    cbar_ax = fig.add_axes([0.83, 0.1, 0.03, 0.55])
    fig.colorbar(im, cax=cbar_ax).set_label('Intensity [dB]')
    
    plt.show()
    
[/code]


CC BY-SA 4.0
2018-06-10T05:43:07.983
44658
2018-06-10T08:47:47.000
2018-06-10T08:47:47.000
15171
28856
question
python python3 matplotlib
時間的に連続した複数のデータファイルを使って、スペクトログラムの図を作りたい


最後に読み込んだファイルの図になるという原因は、スペクトログラムの図を描く`plt.specgram(y,
Fs=1,scale='dB')`には、yデータしかなく時間はわからないので、3つのデータのx座標が同じになるためだと思われます。

それで、パラメータ`xextent`を使って3つのデータのx座標の範囲を決めてやれば3つの図が並んで表示されるようになります。例えば、以下のように変更すればいいでしょう。

[code]

    Pxx, freqs, bins, im = plt.specgram(y, Fs=1,scale='dB', xextent=(i, i+1))
    
[/code]


CC BY-SA 4.0
2018-06-10T08:26:35.897
44659
2018-06-10T08:26:35.897
15171
44658
answer