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

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

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

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

Q&A

解決済

1回答

385閲覧

それぞれの値に対し、範囲のあるグラフを作成したいです。

DobashiT

総合スコア2

Python

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

0グッド

0クリップ

投稿2020/06/23 05:03

編集2020/06/23 07:32

Excelデータ### 前提・実現したいこと

イメージ説明
Excel上のデータ(左表)を使用して右図のような図が書きたいです(64行分全て)。
ある期間に対するサンプルの値がA列(Average)に表示されており、
その期間がB列(開始時間)、C列(終了時間)に記されています。

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

1つだけのAverage(A列)に対するグラフはできるのですが、
複数の行に対するグラフを書くことが出来ません。

該当のソースコード

python

1import matplotlib as mpl 2import matplotlib.pyplot as plt 3import numpy as np 4import pandas as pd 5import datetime 6import matplotlib.dates as mdates 7import openpyxl 8 9wb = openpyxl.load_workbook("Ren1.xlsx") 10ws = wb["Sheet1"] 11 12header_cells = ws[1] 13 14student_list = [] 15for row in ws.iter_rows(min_row=3): 16 row_dic = {} 17 for k, v in zip(header_cells, row): 18 row_dic[k.value] = v.value 19 student_list.append(row_dic) 20 21AV = [] 22for student in student_list: 23 AV.append(student["Average"]) 24 25start = [] 26for student in student_list: 27 start.append(student["Start time"]) 28 29stop = [] 30for student in student_list: 31 stop.append(student["Stop time"]) 32 33A3 = int(start[3]) 34B3 = int(stop[3]) 35C3 = int(AV[3]) 36x = np.arange(A, B, 0.1) 37y = np.arange(-10, 10, 0.1) 38plt.ylim([-20, 20]) 39plt.xlim([-20, 20]) 40y = x + C - x 41plt.plot(x, y) 42plt.show()

試したこと

A3,B3,C3のような内容を60行近く書けばできるのですが、
もっといい方法はないでしょうか

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

python
ここにより詳細な情報を記載してください。![イメージ説明](af4555937cfbf0de9f92e0782c3# 前提・実png)

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

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

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

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

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

jeanbiego

2020/06/23 06:15

このままではインデントが分かりませんので、<code>機能を使ってコードを書き直されたほうが、有用な回答が集まるかと思います。
DobashiT

2020/06/23 06:30

ご指摘頂き、有り難うございました。 早速修正しました。
guest

回答1

0

ベストアンサー

ご要望のものかはわかりませんが、for文で回してみました。
データが付いてなかったので、動作確認はしていません。

python3

1import matplotlib as mpl 2import matplotlib.pyplot as plt 3import numpy as np 4import pandas as pd 5import datetime 6import matplotlib.dates as mdates 7import openpyxl 8 9wb = openpyxl.load_workbook("Ren1.xlsx") 10ws = wb["Sheet1"] 11 12header_cells = ws[1] 13 14student_list = [] 15for row in ws.iter_rows(min_row=3): 16 row_dic = {} 17 for k, v in zip(header_cells, row): 18 row_dic[k.value] = v.value 19 student_list.append(row_dic) 20 21AV = [] 22for student in student_list: 23 AV.append(student["Average"]) 24 25start = [] 26for student in student_list: 27 start.append(student["Start time"]) 28 29stop = [] 30for student in student_list: 31 stop.append(student["Stop time"]) 32 33for A, B, C in zip(start, stop, AV): 34 if C == "non": 35 continue 36 x = np.arange(A, B, 0.1) 37 y = np.arange(-10, 10, 0.1) 38 y = x + C - x 39 40 fig = plt.figure() 41 ax = fig.add_subplot(1,1,1) 42 ax.plot(x, y) 43 plt.ylim([-20, 20]) 44 plt.xlim([-20, 20]) 45 plt.show()

グラフまとめるver.

python3

1import matplotlib as mpl 2import matplotlib.pyplot as plt 3import numpy as np 4import pandas as pd 5import datetime 6import matplotlib.dates as mdates 7import openpyxl 8 9wb = openpyxl.load_workbook("Ren1.xlsx") 10ws = wb["Sheet1"] 11 12header_cells = ws[1] 13 14student_list = [] 15for row in ws.iter_rows(min_row=3): 16 row_dic = {} 17 for k, v in zip(header_cells, row): 18 row_dic[k.value] = v.value 19 student_list.append(row_dic) 20 21AV = [] 22for student in student_list: 23 AV.append(student["Average"]) 24 25start = [] 26for student in student_list: 27 start.append(student["Start time"]) 28 29stop = [] 30for student in student_list: 31 stop.append(student["Stop time"]) 32 33fig = plt.figure() 34ax = fig.add_subplot(1,1,1) 35for A, B, C in zip(start, stop, AV): 36 if C == "non": 37 continue 38 if A is None: 39 continue 40 x = np.arange(A, B, 0.1) 41 y = np.arange(-10, 10, 0.1) 42 y = x + C - x 43 ax.plot(x, y) 44plt.ylim([-20, 20]) 45plt.xlim([-20, 20]) 46plt.show()

投稿2020/06/23 06:47

編集2020/06/23 08:00
jeanbiego

総合スコア3966

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

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

DobashiT

2020/06/23 07:38

早速ご返答頂き、有り難うございます。 実行したところ、 y = x + C - xの行に対し、以下のエラーが出てきてしまいました。。。 TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32') Excelのデータを添付せず申し訳ございません。 編集し、添付しました。
jeanbiego

2020/06/23 07:42

Average列に"non"が入っているとスキップするようにfor文内を追記しました。 下記の問題はありますが、動きはします。 ・スキップしたくない場合は別の処理 ・xlimを-20から20にしているので、後半は枠外に行く
DobashiT

2020/06/23 07:56

修正いただき、有り難うございます。 また丁寧な説明、有り難うございます。 実行してみたところ、図が大量に出てきたのですが、 質問内の右図のように、一つにまとめることは可能でしょうか?
jeanbiego

2020/06/23 08:00

まとめるverを下に足しましたのでご覧ください
DobashiT

2020/06/23 08:04

修正頂き、有難うございました。 とても助かりました。 頂いたコードから様々なことが学べました。 貴重なお時間を頂き、有り難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問