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

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

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

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

Q&A

解決済

2回答

1001閲覧

matplotlibの描画で任意の時間のみ非表示で描画したい

chocotruffe

総合スコア7

Python 3.x

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

0グッド

0クリップ

投稿2022/01/21 04:22

編集2022/01/21 07:26

前提・実現したいこと

Pythonのmatplotlibを用いたグラフの描画方法について質問です。
現在、時系列データの描画を目的としたコーディングをしています。
実現したいことは、時系列データの取得時刻が9:00から20:00まで1時間おきに取得できているのですが、
matplotlibにてx軸を時間にした描画を行うと21:00~8:00までのデータ取得をしていない日時の時系列データの間隔が出てきていしまいます。

グラフを連続的に視認したいので、
21:00~8:00までの間の描画を非表示にする方法をご教示いただけないでしょうか。

発生している問題・エラーメッセージ

21:00~8:00までの間のデータが取得できない時間帯の描画がされるため、
横に伸ばしたようなグラフが出来上がる。
そのため、21:00~8:00までの描画を非表示にしたい。

下記の"該当のソースコード"中でのコメントアウトは「#######」としています。
(#のみですと、teratail様の仕様上、タグとして認識され、太文字・フォントサイズが変わるなど見づらいためです。)

該当のソースコード

import pandas as pd
import openpyxl
import numpy as np
import matplotlib.pyplot as plt

######## グローバル変数
input_file_name = "Book1.xlsx"
######## データの読み込み
input_book = pd.ExcelFile(input_file_name, engine="openpyxl")
input_sheet_name = input_book.sheet_names
df = input_book.parse(input_sheet_name[0])

####### 日付情報をdatetimeの型に変換
df["日付"] = pd.to_datetime(df["日付"])

######## 値の代入
np_df = df["データ"]
x = pd.to_datetime(df['日付'], format='%Y-%m') #日時情報を代入
y = np_df #2列目の値を入れる

######## 描画の初期設定準備
figure_ = plt.figure(1, figsize=(15,10))
axes_ = figure_.add_subplot(111)

######## x軸、y軸、プロットの模様、凡例の名称を設定
axes_.plot(x, y, 'o-', label="データ")
plt.xlabel("Time")
plt.ylabel("Value")

######## 描画する
plt.show()

Excelのデータ(Book1.xlsx)

※下記データの補足
column = ["日付", "データ"]※一番左の番号はindexです。

0 2022/1/1 9:00 100
1 2022/1/1 10:00 250
2 2022/1/1 11:00 300
3 2022/1/1 12:00 450
4 2022/1/1 13:00 600
5 2022/1/1 14:00 800
6 2022/1/1 15:00 700
7 2022/1/1 16:00 400
8 2022/1/1 17:00 150
9 2022/1/1 18:00 200
10 2022/1/1 19:00 270
11 2022/1/1 20:00 300
12 2022/1/2 9:00 200
13 2022/1/2 10:00 350
14 2022/1/2 11:00 400
15 2022/1/2 12:00 550
16 2022/1/2 13:00 700
17 2022/1/2 14:00 900
18 2022/1/2 15:00 800
19 2022/1/2 16:00 500
20 2022/1/2 17:00 250
21 2022/1/2 18:00 300
22 2022/1/2 19:00 370
23 2022/1/2 20:00 400
24 2022/1/3 9:00 300
25 2022/1/3 10:00 450
26 2022/1/3 11:00 500
27 2022/1/3 12:00 650
28 2022/1/3 13:00 800
29 2022/1/3 14:00 1000
30 2022/1/3 15:00 900
31 2022/1/3 16:00 600
32 2022/1/3 17:00 350
33 2022/1/3 18:00 400
34 2022/1/3 19:00 470

試したこと

上記コードを試し、他サイトやブログ等を見ましたが、
解決策が見当たらなかったため、ご教示いただけると嬉しいです。

補足情報(FW/ツールのバージョンなど)

OS: Window10
開発環境: VisualStudio2019
バージョン: Python3.6

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

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

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

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

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

guest

回答2

0

添削いただいたコードにて解決することができました。
ご回答いただきありがとうございました。

投稿2022/01/21 12:47

chocotruffe

総合スコア7

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

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

0

ベストアンサー

一つの方法として、X軸の値を日付ではなくデータの1列目のインデックスに置き換えます。そして、毎日午前9時の時点に ticklabel を付けます。

python

1####### 日付情報をdatetimeの型に変換 2df.rename(columns={df.columns[0]: 'idx'}, inplace=True) # unname を変更しておく 3df["日付"] = pd.to_datetime(df["日付"]) 4 5######## 値の代入 6np_df = df.T.to_numpy() 7x = np_df[0] #1列目値 8y = np_df[2] #3列目の値を入れる 9 10######## 描画の初期設定準備 11figure_ = plt.figure(1, figsize=(10,5)) 12axes_ = figure_.add_subplot(111) 13 14######## x軸、y軸、プロットの模様、凡例の名称を設定 15axes_.plot(x, y, 'o-', label="データ") 16plt.xlabel("Time") 17plt.ylabel("Value") 18label = df.groupby(df['日付'].dt.date).min() # データの出力開始時刻 19plt.xticks(label['idx'].values, label['日付'].dt.strftime('%m-%d %H:%M')) 20 21######## 描画する 22plt.show()

figure

投稿2022/01/21 07:06

melian

総合スコア19803

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問