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

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

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

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

Q&A

解決済

1回答

1502閲覧

python 複数のデータを一つにまとめ、そのMAX値をグラフのy軸の目盛りの最大値にしたい

icepenguin

総合スコア3

Python

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

0グッド

0クリップ

投稿2021/08/19 00:04

編集2021/08/19 06:42

ご質問、失礼いたします。
pythonにてあるフォルダ(input)にある複数のcsvファイルから一定条件のデータを抽出し、一つのデータとして結合。
そのmax値を出力するグラフの目盛りの最大値にしたいと思っているのですがうまくできません。
ご教授いただけますと幸いです。
何卒よろしくお願いいたします。

環境:windows10でPycharmを使用

Python

1import pandas as pd 2import os 3import glob 4import matplotlib.pyplot as plt 5 6data_path = os.path.abspath(r"C:\Users\user\PycharmProjects\pythonProject1\input") 7files = glob.glob(data_path + '/*.csv') 8save_dir = r'C:\Users\user\PycharmProjects\pythonProject1\output' 9 10total_list = [] 11df = [] 12labels = ['50', '60', '70', '80', '90', '100', '110', '120', '130', '140', '150', '160', '170', '180', '190', '200', '210', '220', '230', '240'] 13 14for file in files: 15 filename, file_extension = os.path.splitext(file) 16 basename = os.path.basename(filename) 17 csvfile = pd.read_csv(file, header=6) 18 df2 = pd.cut(csvfile['Diameter (um)'], list(range(50,260,10)), labels=labels, right=False).value_counts(sort=False) 19 df3 = pd.DataFrame(df2) 20 df4 = df3.rename(columns={'Diameter (um)': 'count'}) 21 22 df3['name'] = basename 23 total_list.append(df3) 24 df = pd.concat(total_list) 25 df.to_csv('output/joint.csv') 26 max_value = pd.DataFrame.max(df, numeric_only=True) 27 28 axis = df4.plot.bar(rot=0) 29 plt.title(basename) 30 plt.xlabel("Diameter (um)") 31 plt.ylabel("count") 32 plt.ylim(0, max_value + 20)#←ここのmax_valueを添付した画像の赤丸(100)+20にしたい 33 print(axis) 34 plt.savefig(os.path.join(save_dir, str(basename) + str() + '.png')) 35 36 37
C:\Users\user\PycharmProjects\pythonProject1\venv\Scripts\python.exe C:/Users/user/PycharmProjects/pythonProject1/proto2.py Traceback (most recent call last): File "C:\Users\user\PycharmProjects\pythonProject1\proto2.py", line 31, in <module> plt.ylim(0, max_value) File "C:\Users\user\PycharmProjects\pythonProject1\venv\lib\site-packages\matplotlib\pyplot.py", line 1757, in ylim ret = ax.set_ylim(*args, **kwargs) File "C:\Users\user\PycharmProjects\pythonProject1\venv\lib\site-packages\matplotlib\axes\_base.py", line 3876, in set_ylim if bottom == top: File "C:\Users\user\PycharmProjects\pythonProject1\venv\lib\site-packages\pandas\core\generic.py", line 1442, in __nonzero__ raise ValueError( ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). Process finished with exit code 1

イメージ説明

print(df)

1 Diameter (um) name 250 30 A-1 360 20 A-1 470 20 A-1 580 20 A-1 690 19 A-1 7100 13 A-1 8110 16 A-1 9120 15 A-1 10130 22 A-1 11140 25 A-1 12150 26 A-1 13160 17 A-1 14170 10 A-1 15180 2 A-1 16190 2 A-1 17200 1 A-1 18210 0 A-1 19220 0 A-1 20230 0 A-1 21240 0 A-1 22 Diameter (um) name 2350 30 A-1 2460 20 A-1 2570 20 A-1 2680 20 A-1 2790 19 A-1 28100 13 A-1 29110 16 A-1 30120 15 A-1 31130 22 A-1 32140 25 A-1 33150 26 A-1 34160 17 A-1 35170 10 A-1 36180 2 A-1 37190 2 A-1 38200 1 A-1 39210 0 A-1 40220 0 A-1 41230 0 A-1 42240 0 A-1 4350 20 B-5 4460 9 B-5 4570 3 B-5 4680 3 B-5 4790 5 B-5 48100 9 B-5 49110 8 B-5 50120 5 B-5 51130 7 B-5 52140 3 B-5 53150 5 B-5 54160 18 B-5 55170 41 B-5 56180 79 B-5 57190 86 B-5 58200 100 B-5 59210 65 B-5 60220 39 B-5 61230 21 B-5 62240 7 B-5

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

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

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

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

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

meg_

2021/08/19 00:46

エラー発生行はどこですか?エラーメッセージ全文を載せていただけませんか?
icepenguin

2021/08/19 00:54

大変失礼いたしました。 エラーメッセージを全文に訂正いたしました。
meg_

2021/08/19 01:00

max_value=float(max_value)とした後にプロットするとどうなりますか?
icepenguin

2021/08/19 01:48

ありがとうございます。 エラーはなくなりグラフは出力できたのですが、 目盛りがそれぞれの最大値(添付画像の30と100)で出力されます。 max_valueの中身が 30.0 100.0 になっていたので、 改めてmax(max_value)で抽出しようとしたのですが ---------------------------------------------------- Traceback (most recent call last): File "C:\Users\user\PycharmProjects\pythonProject1\proto2.py", line 34, in <module> print(max(max_value)) TypeError: 'float' object is not iterable ---------------------------------------------------- とエラーが出てしまします。
meg_

2021/08/19 01:58

最大値を取得するときに列を指定した方が良いのではないでしょうか。
icepenguin

2021/08/19 06:46

ご返事遅れてしまい申し訳ありません。 私のやり方が悪いのかもしれませんが、 出力されたcsvファイル(df.to_csv('output/joint.csv'))は添付させていただいた写真のようになっているのですが、 printで出力すると追加させていただいた内容のように、 A-1のデータがダブってしまっています。 なのでmax値が30と100になっているのかと思われます。 どこかダブってしまう要素のコードがあるのでしょうか?
meg_

2021/08/19 14:19

いくつか気になる点があります。 ・dfはcsvファイルから生成されたdf3を元に作成されている ・グラフ化しているのはdf4である ・max_valueはdfから取得している ・同じフィル名('output/joint.csv')で上書き保存している > printで出力すると追加させていただいた内容のように・・・ 上記の件はループ処理中にprint()を入れたので単純に2回表示されただけだと思われます。それであれば問題なしです。
meg_

2021/08/19 14:25

> なのでmax値が30と100になっているのかと思われます。 A-1の最大値は30、B-5の最大値は100なので合っていますね。 質問者さんの本当にやりたいこととコードがちょっと合っていないのでは? 質問者さんの欲しい最大値は対象の全csvのDiameter (um)の最大値なのではないですか?
icepenguin

2021/08/19 15:03

meg_様 meg_様の記載通りでした。 ループ外でmaxをprintしたところ100のみとなっておりましたので、 上記のコードとは違いか所でグラフの出力ループを行ったところうまくできました。 まだまだ自分の書いているコードの内容の理解が足りないようです。 >いくつか気になる点があります。 お指摘通り、自分でも見にくい(dfがいくつもある)内容だと思っていました。 コードの内容を理解するだけでなく、今後は見返したときに見やすいコード作りも心掛けたいと思います。 前回(2週間前)にも引き続き、 お忙しいところ、ご教授いただきありがとうございました。 ベストアンサーなのですが、いち早くご質問いただいたのは meg_様なのですが、回答という形でppaul様にお答えいただいたので、 今回はppaul様をベストアンサーにさせていだだきます。 親切丁寧にご教授いただけたのに大変申し訳ございません。 もし機会がございましたら今後ともよろしくお願いいたします。
guest

回答1

0

ベストアンサー

こちらで実験してみたところ

python

1 plt.ylim(0, max_value + 20)#←ここのmax_valueを添付した画像の赤丸(100)+20にしたい

python

1 plt.ylim(0, max_value[0] + 20)#←ここのmax_valueを添付した画像の赤丸(100)+20にしたい

に変更して普通に動きました。

投稿2021/08/19 05:58

ppaul

総合スコア24666

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

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

icepenguin

2021/08/19 06:48

ありがとうございます! [0]を加えると読み込めました! ですが出力されるグラフ2枚の目盛り最大値がどちらも 120であってほしいのですが、 50と120になってしまいます。 どこかコードが間違っている箇所があるのでしょうか?
icepenguin

2021/08/19 15:04

無事解決できました。 お忙しいところ、ご教授いただきありがとうございました。 もし機会がございましたら今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問