🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

Q&A

解決済

1回答

447閲覧

Python3.7系で関数の引数を無視する方法

Danrussia

総合スコア44

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

0グッド

0クリップ

投稿2019/09/17 09:28

実現したいこと,実装にあたっての問題点

Pyton3.7系とmatplotlibを使用してグラフ(散布図)の描画を自動化したいと考えています。
(参考:https://teratail.com/questions/202186)

下記のデータセット(df)の「BeanNumber_vert」を関数の引数に入力すると、自動で複数系列の散布図を作成するコードは完成しています。

しかしながら、現段階の関数では引数に必ず任意の「BeanNumber_vert」を入力する必要があり、
単数での散布図や要素が3つ以上の散布図の実装ができません。

散布図の要素の数に合わせて関数を定義し直すという方法もあるのですが、コードの行数が長くなる、
場合に応じてファイルを呼び出すのが面倒くさい、といった理由で可能な限り一つの関数で完結させたいです。

ソースコード

Python3

1df = pd.DataFrame({ 2 "Weight(g)": [0.43, 0.4, 0.45, 0.4, 0.35, 0.5, 0.35, 0.51, 0.43], 3 "Long Axis": [0.92, 0.9, 1.04, 0.97, 0.97, 0.8, 0.97, 1.21, 0.92], 4 "Short Axis": [0.91, 0.89, 0.97, 0.92, 0.88, 0.7, 0.88, 0.95, 0.85], 5 "Grain Thickness": [0.73, 0.56, 0.63, 0.74, 0.51, 0.6, 0.51, 0.77, 0.83], 6 "BeanNumber_vert": ['B2', 'B2', 'B2', 'B6', 'B6', 'B6','B39', 'B39', 'B39']}) 7 8 9def plot(data, B1,B2): 10 11 #該当のデータセットを読み込ませる 12 df1 = data[data["BeanNumber_vert"] == B1] 13 df2 = data[data["BeanNumber_vert"] == B2] 14 if df1.empty: 15 print(f"bean number {B2} does not exist in the data frame.") 16 return 17 if df2.empty: 18 print(f"bean number {B2} does not exist in the data frame.") 19 return 20 21 # ------------------------------------- 22 fig, (ax1) = plt.subplots(1, 3, figsize=(35,10)) 23 plt.subplots_adjust(wspace=0.3, hspace=0.2) 24 25 X1_1 = df1[['Weight(g)']] 26 Y1_1 = df1[["Short Axis"]] 27 28 X1_2 = df2[['Weight(g)']] 29 Y1_2 = df2[["Short Axis"]] 30 31 ax1.scatter(X1_1, Y1_1, color="b",s=50) 32 ax1.scatter(X1_2,Y1_2 , color="r",s=50) 33 ax1.set_xlabel("粒重(g)") 34 ax1.set_ylabel("短軸(cm)") 35 36plot(df, B1="B2",B2="B6")

エラーメッセージ・試したこと

Python3

1plot(df, B1="B2") 2--------------------------------------------------------------------------- 3TypeError Traceback (most recent call last) 4<ipython-input-43-b6510950b7a2> in <module>() 5----> 1 plot(df, B1="B2") 6 7TypeError: plot() missing 1 required positional argument: 'B2'

関数に引数を一つしか渡さない場合、上記の様なエラーが発生したので、関数に引数が一つしか渡されなくてもエラーが無視され関数の実行が行われる方向性で問題の解決を試みました。
(errors="ignore"の様なイメージで)

Googleで「missing 1 required positional argument」といった形で検索したのですが、自分の
調べた範囲では、引数をきちっと渡すといったような解決策しか見つけられませんでした。

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

Anaconda
Python
Pycharm
直接的な解決案の回答でなくとも、参考になりそうなサイト、類似の事例を教えて頂けると幸いです。
お忙しいとは思いますが、よろしくお願いいたします。
情報に不足がありましたら、ご指摘お願いいたします。

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

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

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

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

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

tetsunosuke

2019/09/17 09:35

plot(data, B1=None,B2=None) のように定義しておいて、B1, B2 がNoneの場合は無視する、 みたいな意味ですか?
Danrussia

2019/09/17 09:51

「B1,B2がNoneの場合は無視する」という文脈のニュアンスを理解しきれている自信があまりないのですが、関数を呼び出す際の引数がNoneの場合には処理を行わない。というニュアンスで同意だったらそういう意味です。
Danrussia

2019/09/17 09:53

追記:実際に plot(df, B1="B2",B2=None) で実行すると”bean number None does not exist in the data frame.”と出てくるので、Noneというのが恐らく文字列として処理されてしまいます...
t_obara

2019/09/17 09:57

そもそも現状のplotの実装だけであれば、データのリストを渡してループで処理してしまえば良いように思いますが。
tetsunosuke

2019/09/17 10:00

”処理を行わない”は自分で実装しないといけないですが、認識は正しいです。デフォルト引数といいます。 if B2 is None:  # B2が指定されなかったときの処理... のようなイメージです。Noneが「文字列」となっているわけではないです。printしたりしたらNoneと出ますが。 もしくは、可変長引数として渡すという手もあるかなと思います。 https://qiita.com/tomopiro/items/0266a1adf7483cdd94c4
Danrussia

2019/09/17 10:07

t_obraさんへ plotの実装だけだったら確かにfor文を使った方が間違いなく短時間で実装できるのですが、このコードを書いた(教えて頂いた)当初はブーリアンインデックスの理解に四苦八苦していた、for文の動作イメージをイメージしずらいといった背景があったので、このような形でやっています。 少しひと段落したら、リストを渡してのループ処理も検討します。
Danrussia

2019/09/17 10:09

tetsunosukeさんへ 回答ありがとうございます。なんとなくの実装のイメージがつかめました。少しこっちの方で頑張ってみます。
Danrussia

2019/09/17 12:03

tetsunosukeさんへ 直接的な解決策は他の方が提示してくださいましたが、可変長引数の存在自体含め知らなかったので、とても勉強になりました。この度はありがとうございました。
guest

回答1

0

ベストアンサー

リストを使うのが自然な実装だと思います。

python

1import pandas as pd 2 3df = pd.DataFrame( 4 { 5 "Weight(g)": [0.43, 0.4, 0.45, 0.4, 0.35, 0.5, 0.35, 0.51, 0.43], 6 "Long Axis": [0.92, 0.9, 1.04, 0.97, 0.97, 0.8, 0.97, 1.21, 0.92], 7 "Short Axis": [0.91, 0.89, 0.97, 0.92, 0.88, 0.7, 0.88, 0.95, 0.85], 8 "Grain Thickness": [0.73, 0.56, 0.63, 0.74, 0.51, 0.6, 0.51, 0.77, 0.83], 9 "BeanNumber_vert": ["B2", "B2", "B2", "B6", "B6", "B6", "B39", "B39", "B39"], 10 } 11) 12 13 14def plot(data, bean_numbers): 15 fig, ax = plt.subplots() 16 17 for number in bean_numbers: 18 df = data[data["BeanNumber_vert"] == number] 19 ax.scatter(df["Weight(g)"], df["Short Axis"], s=50, label=number) 20 21 ax.set_xlabel("粒重(g)") 22 ax.set_ylabel("短軸(cm)") 23 ax.legend() 24 25 26plot(df, ["B2", "B6"])

イメージ説明

投稿2019/09/17 10:33

tiitoi

総合スコア21956

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

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

Danrussia

2019/09/17 12:01

回答ありがとうございます。恐らく先ほどの方が仰っていたリストを使っての実装法って多分この事なんですね。可読性が高くてシンプルなコードで参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問