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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1845閲覧

pythonでx軸が時間のグラフを作成したい.

abyss80

総合スコア2

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/19 08:43

前提

Pythonでmdatesを用いたグラフを作っています。
グラフの枠組みができても,数値をグラフに反映させることができません.

実現したいこと

x軸が時間,y軸が数値のグラフを作りたい.
y軸の数値はcsvファイルから引用したい.
↑このcsvファイルは1列目が20230119_1800のような時間を表すものになっており,2列目が数値になっている.
エラーなどはないが,折れ線グラフが表示されない.

該当のソースコード

Python

1import matplotlib.pyplot as plt 2import matplotlib.dates as mdates 3import pandas as pd 4import tabulate 5import numpy as np 6 7# テストデータ line6~15 8tm=pd.date_range("20191209 0:00" ,"20191210 0:00" , freq="60min") 9 10dt= pd.read_csv("readimage2.csv",encoding="SHIFT_JIS",usecols=[0,1]) 11 12df=pd.DataFrame(dt) 13 14print(df.to_markdown()) 15 16 17#ここから下はグラフ作成 18 19fig = plt.figure(facecolor="white") 20ax = fig.add_subplot( 21 211, 22 title="20221211 - 20221212", 23 xlabel="Time", 24 ylabel='Coordinate', 25 ) 26 27ax.plot(df["value"] , data=tm ) 28ax.grid(True) 29 30 31#ここから下はグラフの詳細 32 33#x軸の描画の範囲を指定。これを入れないと、時刻がうまくそろわない 34ax.set_xlim(tm[0] , tm[24]) 35 36 37#2時間おきにラベル 38Minute1=mdates.MinuteLocator(range(120),120) 39ax.xaxis.set_major_locator(Minute1) 40 41#30分おきに軸線 42Minute2=mdates.MinuteLocator(range(60),30) 43ax.xaxis.set_minor_locator(Minute2) 44 45#H:M のフォーマットでラベルを書く 46Minute_fmt = mdates.DateFormatter('%H:%M') 47ax.xaxis.set_major_formatter(Minute_fmt) 48 49 50#縦書きの指定 51plt.setp(ax.get_xticklabels(), rotation=45, ha="right") 52 53plt.show() #画像表示

試したこと

ax.plotの中身をいじってみたのですが線がそもそも現れない.

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

python3を使用.

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

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

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

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

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

melian

2023/01/19 08:56

ax.plot () の x と y が逆なのではないでしょうか。 ax.plot(df["value"] , data=tm ) => ax.plot(tm, df["value"])
abyss80

2023/01/23 04:43

melianさん,回答ありがとうございます.ご指摘の通りプログラムを変更してみたのですが,以下のように表示されました. Positional argument cannot appear after keyword argumentsPylance. よってxとyは逆にできないのかなと思います.
abyss80

2023/01/23 04:47

data=tm => tm に変更したところ,実行はできたのですが以下のようなエラーが起きました. raise ValueError(f"x and y must have same first dimension, but " ValueError: x and y must have same first dimension, but have shapes (25,) and (406,)
melian

2023/01/23 05:43

> このcsvファイルは1列目が20230119_1800のような時間を表すものになっており、 pandas.date_range で tm を作成するのではなく、CSV ファイルの1列目の値から tm を作成するとよいかと思います。もしくは、 tm = pd.date_range(start="20191209 0:00", periods=406, freq="60min") とすれば、とりあえず df["Value"] の長さと合わせることができます。ただ、freq="60min" なので、最後の日時は 2019-12-25 21:00:00 になりますが。
abyss80

2023/01/23 07:19

1日の中での,y軸の変化を見るグラフを作りたいです. なので.開始時間:2019-12-11 00:00であれば,終了時間: 2019-12-12 00:00にしたいです. y軸の数値は1分毎に記録したものになります.
melian

2023/01/23 07:27

その場合、1分毎に1日分のデータなので、y値の個数は1440 個ということになるはずなのですが、、、実際には406個しかありませんね。。。
abyss80

2023/01/25 03:13

>>melianさん 406個のデータを撮った時間の部分にだけ折れ線を表示させるというのは厳しいでしょうか? 1日分の枠の中で,該当する時間にだけ折れ線を表示させるという意味です.
melian

2023/01/25 03:15

はい、そうでしたら可能です。時間が取れたら回答に書きます。
abyss80

2023/01/25 03:58

>>melianさん ありがとうございます.回答お待ちしております.
guest

回答1

0

ベストアンサー

readimage2.csv の 1 列目の列名を datetime としていますので適宜変更してください。また、データは適当に乱数で作成しました。開始時刻は 2023/1/25 09:00, 終了時刻は 2023/1/25 15:45 です(データ数 406 個)

python

1import matplotlib.pyplot as plt 2import matplotlib.dates as mdates 3import pandas as pd 4 5df = pd.read_csv("readimage2.csv",encoding="SHIFT_JIS",usecols=[0,1], 6 parse_dates=[0],date_parser=lambda x: pd.to_datetime(x, format='%Y%m%d_%H%M')) 7 8start = df.iloc[0, 0].floor('D') # 切り捨て: 当日の 00:00:00 9end = df.iloc[0, 0].ceil('D') # 切り上げ: 翌日の 00:00:00 10 11#ここから下はグラフ作成 12fig = plt.figure(facecolor="white") 13ax = fig.add_subplot( 14 211, 15 title=f'{start.strftime("%Y%m%d")} - {end.strftime("%Y%m%d")}', 16 xlabel="Time", 17 ylabel='Coordinate', 18 ) 19 20# plot 21ax.plot(df['datetime'], df['value']) 22 23#ここから下はグラフの詳細 24ax.grid(True) 25 26#x軸の描画の範囲を指定 27ax.set_xlim(start, end) 28 29#2時間おきにラベル 30Minute1=mdates.MinuteLocator(range(120),120) 31ax.xaxis.set_major_locator(Minute1) 32 33#30分おきに軸線 34Minute2=mdates.MinuteLocator(range(60),30) 35ax.xaxis.set_minor_locator(Minute2) 36 37#H:M のフォーマットでラベルを書く 38Minute_fmt = mdates.DateFormatter('%H:%M') 39ax.xaxis.set_major_formatter(Minute_fmt) 40 41#縦書きの指定 42plt.setp(ax.get_xticklabels(), rotation=45, ha="right") 43 44plt.show() #画像表示

イメージ説明

投稿2023/01/25 12:51

編集2023/01/25 13:52
melian

総合スコア19798

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

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

abyss80

2023/01/26 06:24

自分が作りたいグラフの理想形がまさにこれでした. 私の拙い説明を汲み取っていただきありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問