質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

2873閲覧

matplotlib:x軸の値空白の期間が線で繋がるのを無くしたいです

kakini

総合スコア42

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/06/25 05:58

matplotlibを使ってx軸に時間を設定した場合、xの値もyの値も存在しない空白の時間があるのですが
その場合、その間の線が直線で繋がってしまうのをなくしたいです

python

1import pandas as pd 2import matplotlib.pyplot as plt 3import datetime 4%matplotlib inline 5df=pd.read_csv("EURUSD_20070201.csv",encoding="shift-jis") 6 7 8#csvを古い日付から順に読み込んでデータフレームに追加していく 9for month in range(1,3): 10 if month<10: 11 month="0"+str(month) 12 else: 13 month=str(month) 14 15 for date in range(1,32): 16 if date<10: 17 date="0"+str(date) 18 else: 19 date=str(date) 20 21 day=month+date 22 try: 23 df=pd.merge(df, pd.read_csv("EURUSD_2007"+day+".csv",encoding="shift-jis"),how="outer") 24 except: 25 continue 26 27 28#読み込んだcsvの時間部分の不要な部分を削除して入れ直し 29date=df["日時"] 30time=[] 31for n in date: 32 n=str(n) 33 n=n[:12] 34 time.append(n) 35time2=pd.to_datetime(time) 36 37 38#終値の列の値を読み込み50分毎の移動平均を作成 39close=df["終値"] 40span01=50 41df["sma01"]=close.rolling(window=span01).mean() 42 43 44#描画 45fig=plt.figure(figsize=(20,10)) 46date1=datetime.datetime(2007,2,1) 47date2=datetime.datetime(2007,2,28) 48ax=fig.add_subplot(1,1,1) 49ax.plot(time2, df["sma01"],label="sma01",color="#e84a5f") 50ax.set_xlim(date1,date2) 51plt.show()

読み込んだcsvは一部省略して下記の様な感じになっています
日時・始値・高値・安値・終値
20070201070000,1.3031,1.3031,1.3031,1.3031
20070201070100,1.3031,1.3031,1.3030,1.3030
20070201070200,1.3030,1.3031,1.3030,1.3031
20070201070300,1.3030,1.3031,1.3030,1.3031
20070201070400,1.3031,1.3031,1.3030,1.3031
20070201070500,1.3031,1.3031,1.3030,1.3030
20070201070600,1.3031,1.3031,1.3030,1.3030
20070201070700,1.3031,1.3031,1.3030,1.3030
20070201070800,1.3031,1.3031,1.3030,1.3030
/////////////////////////////////////////////
/////////////////////////////////////////////
20070202065400,1.3022,1.3022,1.3022,1.3022
20070202065500,1.3021,1.3022,1.3021,1.3021
20070202065600,1.3021,1.3021,1.3019,1.3020
20070202065700,1.3021,1.3021,1.3021,1.3021
20070202065800,1.3022,1.3022,1.3019,1.3020
20070202065900,1.3020,1.3021,1.3019,1.3020

読み込んだcsvなのですが土日と一部特別な日付の時のcsvは存在しないので読み込んでいません
その状態で描画した時上の例だとx軸で土日に該当する期間が横一直線に線が引かれてしまいます

土曜朝6:59から月曜朝7:00までの期間内が繋がれています

この空白の期間を描画せずにうまく週末から週初めのグラフを描画させるにはどうしたらよいでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

細かく見ていませんので、概要です。適当に変更して使ってください。

まず、data作成。

python

1>>> import pandas as pd 2>>> import matplotlib 3>>> import matplotlib.pyplot as plt 4>>> import io 5>>> import datetime 6>>> 7>>> indata = '''日時 終値 8... 20070203045800 1.3010 9... 20070203065900 1.3030 10... 20070205070000 1.3080 11... 20070205080000 1.3040''' 12>>> 13>>> with io.StringIO(indata) as f: 14... df = pd.read_csv(f, sep=' +', engine='python') 15... 16>>> print(df) 17 日時 終値 180 20070203045800 1.301 191 20070203065900 1.303 202 20070205070000 1.308 213 20070205080000 1.304

日時をdatetimeに変換

python

1>>> df['日時'] = df['日時'].apply(lambda x: datetime.datetime.strptime(str(x), "%Y%m%d%H%M%S")) 2>>> print(df) 3 日時 終値 40 2007-02-03 04:58:00 1.301 51 2007-02-03 06:59:00 1.303 62 2007-02-05 07:00:00 1.308 73 2007-02-05 08:00:00 1.304

ダミーの日時を追加

python

1>>> df_dummy = pd.DataFrame({'日時': [datetime.datetime(2007, 2, 4, 7)]}) 2>>> df2 = pd.merge(df, df_dummy, how='outer').sort_values('日時') 3>>> print(df2) 4 日時 終値 50 2007-02-03 04:58:00 1.301 61 2007-02-03 06:59:00 1.303 74 2007-02-04 07:00:00 NaN 82 2007-02-05 07:00:00 1.308 93 2007-02-05 08:00:00 1.304

ダミー追加前とダミー追加後を並べて表示

python

1matplotlib.rc('font', family='MS Gothic') 2fig = plt.figure() 3ax1 = fig.add_subplot(1, 2, 1) 4ax2 = fig.add_subplot(1, 2, 2) 5df.plot('日時', '終値', ax=ax1) 6df2.plot('日時', '終値', ax=ax2) 7plt.show()

実行結果のグラフ
イメージ説明

投稿2021/06/28 17:17

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問