前提・実現したいこと
txt fileに日付と値を保存してそれを呼び出して新しく値を追加して、グラフ化したい。
日付は連続的ではない可能性があるためstrではなくdatetime.date形式からplotしたい
Matplotlibで間隔が疎らな時系列データを可視化する
上記を参考にしました。
発生している問題・エラーメッセージ
ValueError: DateFormatter found a value of x=0, which is an illegal date. This usually occurs because you have not informed the axis that it is plotting dates, e.g., with ax.xaxis_date()
該当のソースコード
python3
1import datetime 2import numpy as np 3import matplotlib.pyplot as plt 4 5path_date = 'BodyWeight_date.txt' 6path_coins = 'BodyWeight_weight.txt' 7 8def add_data(coins): 9 with open(path_date) as f: 10 date_list = [s.strip() for s in f.readlines()] 11 date_list = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in date_list] 12 date_list = [datetime.date(date.year, date.month, date.day)for date in date_list] 13 date_list.append(datetime.date.today()) 14 15 with open(path_coins) as f: 16 coins_list = [float(s.strip()) for s in f.readlines()] 17 18 coins_list.append(coins) 19 print(type(date_list[0])) 20 print(date_list) 21 print(coins_list) 22 23 24 with open(path_date, mode='w') as f: 25 date_list = [str(t) for t in date_list] 26 f.write('\n'.join(date_list)) 27 with open(path_coins, mode='w') as f: 28 coins_list = [str(i) for i in coins_list] 29 f.write('\n'.join(coins_list)) 30 31 ax = plt.subplot() 32 ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d')) 33 ax.plot(date_list,coins_list) 34 plt.show() 35 36# plt.xticks(rotation=70) 37# plt.plot(date_list, coins_list) 38# plt.show()
最後の4行の代わりにコメントアウトした3行を使うとエラーは出ませんが表示間隔が時間通りにならず,欲しいグラフをプロットできません。(str型ではなくdatetime型でプロットしたい)
BodyWeight_date.txt
2020-07-18 2020-07-31 2020-08-02
BodyWeight_weight.txt
50.9 50.8 51.1
試したこと
下記(txtから読み込んでない)だとやりたいことが実現できています。
python
1temperature = [(datetime.datetime.strptime(t, '%Y-%m-%d %H:%M:%S'), v) for t,v in [ 2 ('2018-11-08 23:13:00', 37.5), 3 ('2018-11-19 01:12:00', 39.0), 4 ('2018-12-19 02:38:00', 38.1), 5 ('2018-12-19 10:14:00', 37.0), 6 ('2018-12-19 18:44:00', 36.7), 7 ('2018-12-19 21:41:00', 37.5), 8 ('2018-12-20 03:17:00', 37.5), 9 ('2018-12-20 11:47:00', 37.0), 10 ('2018-12-20 16:58:00', 36.6), 11 ('2018-12-20 19:14:00', 37.2), 12 ('2018-12-21 19:34:00', 36.8), 13 ('2018-12-22 00:42:00', 36.7), 14 ('2018-12-22 14:59:00', 36.8), 15]] 16import pandas as pd 17df = pd.DataFrame(temperature, columns=['time', 'temperature']) 18x=[] 19y=[] 20for row in temperature: 21 x.append(datetime.date(row[0].year, row[0].month, row[0].day)) 22 y.append(row[1]) 23ax = plt.subplot() 24print(x) 25print(y) 26ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d')) 27# ax.set_xlim(datetime.datetime(2018, 12, 18, 18), datetime.datetime(2018, 12, 22, 18)) 28# ax.set_ylim(36.3, 39.2) 29print(type(x[0])) 30ax.plot(x,y) 31plt.show()
間違ってエラーが出るコードで作成したdate_list,coins_listのtypeは上記の思い通り動いたコードのx,yと同じはずです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/05 07:40