質問するログイン新規登録

Q&A

解決済

3回答

229閲覧

このコードを簡素化したいです

yyicp

総合スコア97

Python

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

1グッド

0クリップ

投稿2025/12/25 02:14

1

0

実現したいこと

グラフを出力したいディレクトリの中に、1.csv、2.csv、10.csvという3つのファイルが入っているとします。「該当のソースコード」で1.csv、2.csv、10.csvのdensity.jpgとp.jpgが正しく出力されます。
今、1.csvと10.csvだけのdensity.jpgとp.jpgを出力したときには、8行目と22行目の

files = Path(".").glob("*.csv")をfiles = Path(".").glob("*.csv")

files = Path(".").glob("*.csv")をfiles = Path(".").glob("1*.csv")

にすれば良いですが、8行目も22行目も直さなくてはいけないです。

今はグラフが2つですが、いくつもグラフを描きたいときは8行目と22行目のような修正をたくさんしなければいけないので、1回で済ませたいです。どのように直せば良いでしょうか。

該当のソースコード

python

1import pandas as pd 2import matplotlib.pyplot as plt 3import glob 4from pathlib import Path 5 6savename ='density.jpg' 7fig, ax = plt.subplots() 8files = Path(".").glob("*.csv") 9 10for file in files: 11 df = pd.read_csv(file, encoding="utf-8") 12 ax.plot('y[mm]', 'density[kg/m3]', data=df, marker='none', label=file.stem, linestyle='-') 13 14ax.set_xlabel('$y$[mm]',fontsize=15) 15ax.set_ylabel('$density[kg/m3]$',fontsize=15) 16ax.grid() 17plt.savefig(savename) 18plt.show() 19 20savename ='p.jpg' 21fig, ax = plt.subplots() 22files = Path(".").glob("*.csv") 23 24for file in files: 25 df = pd.read_csv(file, encoding="utf-8") 26 ax.plot('y[mm]', 'pressure[Pa]', data=df, marker='none', label=file.stem, linestyle='-') 27 28ax.set_xlabel('$y$[mm]',fontsize=15) 29ax.set_ylabel('$pressure$[Pa]',fontsize=15) 30ax.grid() 31plt.savefig(savename) 32plt.show()

試したこと

以下のようにすると、density.jpgは正しく表示されますが、p.jpgは線のない白紙のグラフが表示されました。

python

1import pandas as pd 2import matplotlib.pyplot as plt 3import glob 4from pathlib import Path 5 6files = Path(".").glob("1*.csv") 7 8savename ='density.jpg' 9fig, ax = plt.subplots() 10 11for file in files: 12 df = pd.read_csv(file, encoding="utf-8") 13 ax.plot('y[mm]', 'density[kg/m3]', data=df, marker='none', label=file.stem, linestyle='-') 14 15ax.set_xlabel('$y$[mm]',fontsize=15) 16ax.set_ylabel('$density[kg/m3]$',fontsize=15) 17ax.grid() 18plt.savefig(savename) 19plt.show() 20 21savename ='p.jpg' 22fig, ax = plt.subplots() 23 24for file in files: 25 df = pd.read_csv(file, encoding="utf-8") 26 ax.plot('y[mm]', 'pressure[Pa]', data=df, marker='none', label=file.stem, linestyle='-') 27 28ax.set_xlabel('$y$[mm]',fontsize=15) 29ax.set_ylabel('$pressure$[Pa]',fontsize=15) 30ax.grid() 31plt.savefig(savename) 32plt.show()
melian👍を押しています

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

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

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

guest

回答3

0

重複が多いので、関数化してリファクタリングするとよいかと思います。

python

1import pandas as pd 2import matplotlib.pyplot as plt 3from pathlib import Path 4 5def plot_csv_data(y_column, ylabel, save_filename): 6 fig, ax = plt.subplots() 7 files = Path(".").glob("*.csv") 8 9 for file in files: 10 df = pd.read_csv(file, encoding="utf-8") 11 ax.plot('y[mm]', y_column, data=df, marker='none', label=file.stem, linestyle='-') 12 13 ax.set_xlabel('$y$[mm]', fontsize=15) 14 ax.set_ylabel(f'${ylabel}$', fontsize=15) 15 ax.grid() 16 plt.savefig(save_filename) 17 plt.show() 18 19if __name__ == "__main__": 20 plot_csv_data('density[kg/m3]', 'density[kg/m3]', 'density.jpg') 21 plot_csv_data('pressure[Pa]', 'pressure[Pa]', 'p.jpg')

こうすれば、plot_csv_dataの処理を1回修正するだけで、対象ファイルを変更することができます。

投稿2025/12/25 02:52

neko_the_shadow

総合スコア2441

yyicp

2025/12/25 04:47

できました。 どうもありがとうございました。
guest

0

ベストアンサー

他の回答にあるように、書き直すのがすっきりしそうですが、今の形を使う方法を考えるならば、
試したことの6行目を下記のようにして、filesをリストにしてしまうのが簡単です。

python

1files = list(Path(".").glob("1*.csv"))

Path.glob() はジェネレータを返すので、一回 for を通すと中身が消費されてしまい、二回目の for では何も処理されません。
リストにしてしまえば、二回目の for でも最初から繰り返してくれます。

投稿2025/12/25 03:54

bsdfan

総合スコア4963

yyicp

2025/12/25 04:46

できました。 どうもありがとうございました。
guest

0

それぞれのグラフの属性を辞書(dict)として定義してみてはどうでしょうか。

python

1import pandas as pd 2import matplotlib.pyplot as plt 3import glob 4from pathlib import Path 5 6plots = [ 7 { 8 "files": Path(".").glob("*.csv"), 9 "ycolumn": "density[kg/m3]", 10 "ylabel": "$density[kg/m3]$", 11 "savename": "density.jpg" 12 }, 13 { 14 "files": Path(".").glob("1*.csv"), 15 "ycolumn": "pressure[Pa]", 16 "ylabel": "$pressure$[Pa]", 17 "savename": "p.jpg" 18 }, 19] 20 21for p in plots: 22 fig, ax = plt.subplots() 23 for file in p["files"]: 24 df = pd.read_csv(file, encoding="utf-8") 25 ax.plot('y[mm]', p["ycolumn"], data=df, marker='none', label=file.stem, linestyle='-') 26 ax.set_xlabel('$y$[mm]',fontsize=15) 27 ax.set_ylabel(p["ylabel"],fontsize=15) 28 ax.grid() 29 ax.legend() 30 plt.savefig(p["savename"])

投稿2025/12/25 02:34

編集2025/12/25 02:48
melian

総合スコア21615

yyicp

2025/12/25 04:46

できました。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問