質問: plt.subplots(1, len(grouped_df)) for ax, (name, df) in zip(axs, grouped_df): ここでのzipは2つの引数を渡すために設定している。 df['Area'].hist(ax=ax) ax.set_title(name) plt.show() ``` ・コード2行目の変数に"fig , ax"と入れているのですが、このfig , axがなしている意味を調べてみたのですが、公式ドキュメントにも特に何も記述がありませんでした。この変数の代わりに適当に文字を 入れてもなりたたなかったので、これは一種の仕様的なものですか? ・for文の中で”ax"を適当な文字として入れた後に"(name, df)"と入れているいるのですが、 なぜ一度もコードの中で登場がなかった"name"がグラフのタイトルを担う役割ができるのか
回答: `DataFrame.groupby('Sample')` の結果にてループ処理を行い、 各ループ毎にヒストグラムを描画するよいのではないでしょうか。 ``` import pandas as pd import numpy as np import matplotlib.pyplot as plt # 適当なデータを乱数で作成 N=120 #データ数 df = pd.DataFrame({ 'Area': np.random.randint(0,100,N), 'Sample': np.random.choice(['くるみ豆','五葉黒豆','濃緑丸豆'],N) }) # 一応、以下が回答部分 grouped_df= df.groupby('Sample') fig, axs = plt.subplots(1, len(grouped_df)) for ax, (name, df) in zip(axs, grouped_df): df['Area'].hist(ax=ax) ax.set_title(name) plt.show() ``` ### 【コメントを受けて追記1】 順番が逆になりますが、まずは `groupby()` から。 一般的に `DataFrame.groupby()` をループで使用する場合はこんな感じで記述します。 ``` for name, data in pd.groupby('Sample'): # 何らかの処理 ``` このようにすると、Sample列の値が同じもの同士でグループ分けして、そのグループ毎に ループ処理がおこなわれます。またこの際に、ループにには2つの変数が渡され、 * 1つ目(上記のコードでは`name`)はグループ分けに使用した `Sample` の値、 * 2つ目(上記のコードでは`data`)はグループ分けされたDataFrame が入ります。 今回、回答で記述したコードはこの簡単なバリエーションで、別の配列 `axs`(後で説明) と同期して一緒にループ処理を行う必要があったので `zip()` を使用して ``` axs = [......] # 何らかの配列 for ax, (name, data) in enumerate(axs, pd.groupby('Sample')): # 何らかの処理 ``` という記述になっております。当然 `name` には グループ分けに使用した `Sample` の値 が入っておりますので、そのままタイトルに利用しているだけです。 ### 【コメントを受けて追記2】 次に1つ目の件ですが、まずは あたりを読むと理解が深まるかと思います。 とりあえず、簡単に説明すると * figure はグラフを書くための図(を書くためのエリア) * axは1つ1つのグラフ となっており、1つの図(figure)には複数のグラフ(ax)を入れる事が出来ます。 1つの図にどのようにグラフを配置するかは `subplots()` の引数にて設定されており、 第一引数が縦に並べるグラフ数、第二引数が横に並べるグラフの数となりますので 例えをあげると、 * `fig, axs = plt.subplots(1,4)` : 横に4個グラフを並べる * `fig, axs = plt.subplots(4,1)` : 縦に4個グラフを並べる * `fig, axs = plt.subplots(2,2)` : 横2個、縦2個(計4個)のグラフを並べる のようになります。 この時の2つめ戻り値(`axs`) は図に配置された各グラフが格納された配列となっておりますので、 ``` fig, axs = plt.subplots(1,4) axs[0].plot() #1番目のグラフをプロット axs[1].plot() #2番目のグラフをプロット axs[2].plot() #3番目のグラフをプロット axs[3].plot() #4番目のグラフをプロット ``` のように記述することで、各グラフを描画することができます。 で、今回の回答のコードは上記の描画処理を単にループを使って ``` fig, axs = plt.subplots(1,4) for as in axs: ax.plot() # 各グラフにプロット ``` のように記述しただけの処理となります (前述のとおり `zip` を使ってデータと一緒にループされております) > > この変数の代わりに適当に文字を入れてもなりたたなかったので、これは一種の仕様的なものですか? > > いや、`fig` も `axs` も私が勝手に決めた変数名ですので変更しても動作するはずです。 > > >