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

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

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

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

367閲覧

ValueError: x and y must have same first dimension, but have shapes (25,) and (406,)を解決したい.

abyss80

総合スコア2

Matplotlib

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2023/01/23 05:09

前提

Pythonでx軸が時間,y軸が数値のグラフを作成するプログラムを作っています。
y軸はcsvファイルから数値を抽出しています.
プログラムの作成中に以下のエラーメッセージが発生しました。

csvファイルは雑ですが以下のようになってます.
filename , value
20230101_1200 , 300
20230101_1201 , 250
20230101_1202 , 350
: ,      :

実現したいこと

  • x軸が時間でy軸が数値のグラフを作るプログラムを作成したい.

y軸の数値はcsvファイルから取り出したい.
グラフの枠はできるのだが,折れ線が出てこない.

また,上記のグラフを作れるプログラムであれば該当のソースコードじゃない方法も教えていただきたいです.

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

ValueError: x and y must have same first dimension, but have shapes (25,) and (406,)

Python

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

試したこと

ax.plot()の中身のxとyを逆にするとエラーは吐かなくなるが折れ線が出てこない.

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

python3を使っていて,Macを利用しています.

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

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

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

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

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

can110

2023/01/23 05:30

単純に、xは1時間毎なので25個、yはCSVの行数なので406個と数が合っていないのですが それをどのように描画したいのでしょうか?
abyss80

2023/01/23 06:13

>>can110さん 回答ありがとうございます. yの406個を全て描画し,xの時間は1時間ごとにラベリングしたいです. yの406個は1分毎に記録したものであり,全て違う時間になります.
can110

2023/01/23 06:24

つまりは 「tm=pd.date_range("20191209 0:00" ,"20191210 0:00" , freq="60min")」のところで Yのデータ数406個にあった日時データを作成する方法が分からない (上記の場合の開始日時から406時間後の終了日時を計算する方法が分からない) ということでしょうか?
abyss80

2023/01/23 07:13

自分の文章の書き方が悪かったみたいで,誤解があります. Yのデータ数406個,これは1分毎の記録です. ですので,Yのデータ個数は最大60*24=1440個にまでなります. グラフ全体として,1日(24時間)の中でのYのデータの変化を見るグラフを作りたいと考えております. 枠:開始日時から24時間後の範囲 線:該当している時間の間のみ表示される線 が理想となっております.
can110

2023/01/23 07:28 編集

> tm=pd.date_range("20191209 0:00" ,"20191210 0:00" , freq="60min") そもそも上記の提示コードにおいて、1分毎ではなく1時間毎の値を求めている理由はなんでしょうか? あるいは、これを1分毎として、終了日時を406(データ数)分後に指定すればよいと思いますが、いかがでしょうか? すなわち、エラー(xとyの個数が異なる)の原因と、その対処法までは現時点で理解されているでしょうか? あと、ぱっと見てfilenameというのがそのデータの記録日時と思うのですが それは無視する感じでしょうか?
abyss80

2023/01/25 03:45

返信遅れてしまい申し訳ございません. 回答されたグラフが私の求めていた理想形です. 一つ教えて頂きたいのですが,テストデータの部分をcsvファイル(仮にtest.csvとします.)から持ってくる際にはどうすればよろしいでしょうか. 一つ一つ”#テストデータ”の場所に打ち込まなければならないでしょうか?
abyss80

2023/01/25 03:46

teratailの仕様を詳しく理解していないため,ベストアンサーに決めてしまうとcan110さんと連絡を取れないかと思い,一時的に保留しております.
abyss80

2023/01/25 03:53

df=pd.read_csv("test.csv")で無事完成させることができました.
guest

回答1

0

ベストアンサー

x軸が時間でy軸が数値のグラフを作るプログラムを作成したい.

求めている結果に沿っているか分かりませんが、わたしならfilename列値がx軸の時間だと想定して、それを利用する以下のようなコードを書きます。

Python

1import matplotlib.pyplot as plt 2import matplotlib.dates as mdates 3import pandas as pd 4from io import StringIO 5from datetime import datetime, timedelta 6 7# テストデータ 8s = """filename,value 920230101_1200,300 1020230101_2001,250 1120230101_2202,350""" 12df = pd.read_csv(StringIO(s)) 13 14# filenameを日時に変換 15df['filename'] = pd.to_datetime(df['filename'], format='%Y%m%d_%H%M') 16xs, ys = df.T.values 17 18# とりあえず先頭行の日の0時~末尾行の日の24時までをx範囲とする 19x_st = xs[0].date() 20x_ed = xs[-1].date() + timedelta(days=1) 21 22fig = plt.figure(facecolor="white") 23ax = fig.add_subplot(211, title=f'{x_st} - {x_ed}', xlabel='Time', ylabel='Coordinate') 24ax.plot(xs, ys) 25ax.grid(True) 26 27ax.set_xlim(x_st,x_ed) 28 29ax.xaxis.set_major_locator(mdates.MinuteLocator(range(120),120)) 30ax.xaxis.set_minor_locator(mdates.MinuteLocator(range(60),30)) 31ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) 32plt.setp(ax.get_xticklabels(), rotation=45, ha="right") 33plt.show()

イメージ説明

投稿2023/01/23 09:08

can110

総合スコア38266

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

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

abyss80

2023/01/25 03:56

csvファイルの"filename"の日付部分をグラフ用に変換していただくことで,自分の理想とするグラフを完成させることができました. 拙い説明でしたが,意図を汲み取っていただきありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問