noname20220504
@noname20220504

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

matplotlibによる画像保存について(白い画像しか保存されません)

解決したいこと

python3.8.13のmatplotlibでスペクトログラム画像を保存したいのですが、真っ白な画像しか保存されません。

時刻歴波形のデータが入ったcsvを読み取って、連続ウェーブレット変換(CWT)を行い、得られたスペクトログラムを所定のフォルダに保存するプログラムを書いています。しかし、スペクトログラム画像を出力する際に、真っ白な画像しか保存されません。
ちなみに、spyderのplot画面では、ちゃんとスペクトログラム画像が表示されているので、CWT自体は正常に計算されていると思われます。

また、プログラム実行時に下記のメッセージが表示されました。
(python 3.8.8が入っている別のPCで実行した際には、このような事象はみられませんでした。)

plt.show()の位置入れ替えについては既に試しているので、それ以外で解決策がありましたら、ご教示願います。

 ComplexWarning: Casting complex values to real discards the imaginary part
  return np.asarray(x, float)
<Figure size 576x720 with 0 Axes>

スクリーンショット 2022-05-04 1243.png

スクリーンショット 2022-05-04 125427.png

該当するソースコード

python 3.8.13
# -*- coding: utf-8 -*-
"""
import csv
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import pywt
from PIL import Image
import os

input_csv = pd.read_csv('test.csv')
input_csv = np.array(input_csv)
time = input_csv[:,0]
#print(time)

for i in range(1,11):
    Pa = input_csv[:,i]
    plt.plot(time, Pa, linestyle='solid', marker='None')
#    plt.show()

    dt = 7.8125e-005 # サンプリング間隔(時間)
    fs = 1/dt # サンプリング周波数
    nq_f = fs/2.0 # ナイキスト周波数

# 解析したい周波数のリスト(ナイキスト周波数以下)
# 1 Hz ~ nq_f Hzの間を等間隔に50分割
    freqs = np.linspace(1,nq_f,1920)

# サンプリング周波数に対する比率を算出
    freqs_rate = freqs / fs

# スケール:サンプリング周波数=1:fs(1/dt)としてスケールに換算
    scales = 1 / freqs_rate
# 逆順に入れ替え
    scales = scales[::-1]

#ウェーブレットの種類
    wavlist = pywt.wavelist(kind='continuous')

#マザーウェーブレットの描画
    wavelet_type = 'cmor1.5-1.0'
    wav = pywt.ContinuousWavelet(wavelet_type)
    
# precisionによってデータ個数(len)が変わる
    int_psi, x = pywt.integrate_wavelet(wav, precision=8)
    plt.plot(x, int_psi)

    frequencies_rate = pywt.scale2frequency(scale=scales, wavelet=wavelet_type)

# スケール:サンプリング周波数=1:fs(1/dt)として換算
    frequencies = frequencies_rate / dt

#ウェーブレットの描画
    cwtmatr, freqs_rate = pywt.cwt(Pa, scales=scales, wavelet=wavelet_type)

#軸ラベルの修正
    from typing import List, Tuple
    def get_ticks_label_set(all_labels:List, num:int)-> Tuple[List, List]:
        length = len(all_labels)
        step = length//(num-1)
        pick_positions = np.arange(0, length, step)
        pick_labels = all_labels[::step]
        return pick_positions, pick_labels

    x_positions=[0,257,513,769,1025,1281,1537]
    x_labels=[0,20,40,60,80,100,120]

    y_positions=[1920, 1841, 1761, 1681, 1601, 1521, 1441, 1361, 1281]#, 1201, 1121, 1041, 961]
    y_labels=   [0, 250, 500, 750, 1000, 1250, 1500, 1750, 2000]#, 2250, 2500, 2750, 3000]

#軸ラベルを貼り付ける
    plt.imshow(np.abs(cwtmatr), cmap=plt.cm.jet, aspect='auto', vmin=0, vmax=10)
    plt.yticks(y_positions, y_labels)
    plt.xticks(x_positions, x_labels)
    plt.xlim(0,1403) #1403:0.11sec 4096:0.32sec
    #plt.ylim(1920,961)#1920:0Hz, 961:6400Hz, Δf=3.125Hz
    plt.ylim(1920,1281)#1920:0Hz, 1281:2000Hz, 961:6400Hz, Δf=3.125Hz
    plt.xlabel("Time[msec]")
    plt.ylabel("Frequency[Hz]")
    plt.colorbar()
    plt.figure(figsize=(8,10))
    os.chdir("./20220504/")
    plt.savefig(f'CWT_test_{i:03d}.png')
    plt.show()
    os.chdir("../")
    
    

自分で試したこと

plt.savefigとplt.showの順序入れ替え
os.chdirのコメントアウト

0

1Answer

Comments

  1. @noname20220504

    Questioner

    ご教示いただいた通りにしたところ、無事に保存できました。
    ありがとうございました!

Your answer might help someone💌