matplotlibによる画像保存について(白い画像しか保存されません)
Q&A
Closed
解決したいこと
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>
該当するソースコード
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