回答編集履歴

3

補足を追加2

2019/07/10 00:28

投稿

magichan
magichan

スコア15898

test CHANGED
@@ -111,3 +111,99 @@
111
111
  という記述になっております。当然 ``name`` には グループ分けに使用した `Sample` の値
112
112
 
113
113
  が入っておりますので、そのままタイトルに利用しているだけです。
114
+
115
+
116
+
117
+ ---
118
+
119
+ ### 【コメントを受けて追記2】
120
+
121
+ 次に1つ目の件ですが、まずは
122
+
123
+
124
+
125
+ [https://matplotlib.org/3.1.1/tutorials/intermediate/gridspec.html](https://matplotlib.org/3.1.1/tutorials/intermediate/gridspec.html)
126
+
127
+ [https://qiita.com/tsuruokax/items/90167693f142ebb55a7d](https://qiita.com/tsuruokax/items/90167693f142ebb55a7d)
128
+
129
+
130
+
131
+ あたりを読むと理解が深まるかと思います。
132
+
133
+
134
+
135
+ とりあえず、簡単に説明すると
136
+
137
+
138
+
139
+ - figure はグラフを書くための図(を書くためのエリア)
140
+
141
+ - axは1つ1つのグラフ
142
+
143
+
144
+
145
+ となっており、1つの図(figure)には複数のグラフ(ax)を入れる事が出来ます。
146
+
147
+ 1つの図にどのようにグラフを配置するかは ``subplots()`` の引数にて設定されており、
148
+
149
+ 第一引数が縦に並べるグラフ数、第二引数が横に並べるグラフの数となりますので
150
+
151
+
152
+
153
+ 例えをあげると、
154
+
155
+ - ``fig, axs = plt.subplots(1,4)`` : 横に4個グラフを並べる
156
+
157
+ - ``fig, axs = plt.subplots(4,1)`` : 縦に4個グラフを並べる
158
+
159
+ - ``fig, axs = plt.subplots(2,2)`` : 横2個、縦2個(計4個)のグラフを並べる
160
+
161
+
162
+
163
+ のようになります。
164
+
165
+ この時の2つめ戻り値(``axs``) は図に配置された各グラフが格納された配列となっておりますので、
166
+
167
+
168
+
169
+ ```Python
170
+
171
+ fig, axs = plt.subplots(1,4)
172
+
173
+ axs[0].plot() #1番目のグラフをプロット
174
+
175
+ axs[1].plot() #2番目のグラフをプロット
176
+
177
+ axs[2].plot() #3番目のグラフをプロット
178
+
179
+ axs[3].plot() #4番目のグラフをプロット
180
+
181
+ ```
182
+
183
+ のように記述することで、各グラフを描画することができます。
184
+
185
+
186
+
187
+ で、今回の回答のコードは上記の描画処理を単にループを使って
188
+
189
+
190
+
191
+ ```Python
192
+
193
+ fig, axs = plt.subplots(1,4)
194
+
195
+ for as in axs:
196
+
197
+ ax.plot() # 各グラフにプロット
198
+
199
+ ```
200
+
201
+ のように記述しただけの処理となります
202
+
203
+ (前述のとおり ``zip`` を使ってデータと一緒にループされております)
204
+
205
+
206
+
207
+ > この変数の代わりに適当に文字を入れてもなりたたなかったので、これは一種の仕様的なものですか?
208
+
209
+ いや、``fig`` も ``axs`` も私が勝手に決めた変数名ですので変更しても動作するはずです。

2

追記1

2019/07/10 00:28

投稿

magichan
magichan

スコア15898

test CHANGED
@@ -49,3 +49,65 @@
49
49
 
50
50
 
51
51
  ```
52
+
53
+
54
+
55
+ ---
56
+
57
+ ### 【コメントを受けて追記1】
58
+
59
+
60
+
61
+ 順番が逆になりますが、まずは ``groupby()`` から。
62
+
63
+
64
+
65
+ 一般的に ``DataFrame.groupby()`` をループで使用する場合はこんな感じで記述します。
66
+
67
+
68
+
69
+ ```Python
70
+
71
+ for name, data in pd.groupby('Sample'):
72
+
73
+ # 何らかの処理
74
+
75
+ ```
76
+
77
+
78
+
79
+ このようにすると、Sample列の値が同じもの同士でグループ分けして、そのグループ毎に
80
+
81
+ ループ処理がおこなわれます。またこの際に、ループにには2つの変数が渡され、
82
+
83
+ - 1つ目(上記のコードでは`name`)はグループ分けに使用した `Sample` の値、
84
+
85
+ - 2つ目(上記のコードでは`data`)はグループ分けされたDataFrame
86
+
87
+
88
+
89
+ が入ります。
90
+
91
+
92
+
93
+ 今回、回答で記述したコードはこの簡単なバリエーションで、別の配列 ``axs``(後で説明)
94
+
95
+ と同期して一緒にループ処理を行う必要があったので ``zip()`` を使用して
96
+
97
+
98
+
99
+ ```Python
100
+
101
+ axs = [......] # 何らかの配列
102
+
103
+ for ax, (name, data) in enumerate(axs, pd.groupby('Sample')):
104
+
105
+ # 何らかの処理
106
+
107
+ ```
108
+
109
+
110
+
111
+ という記述になっております。当然 ``name`` には グループ分けに使用した `Sample` の値
112
+
113
+ が入っておりますので、そのままタイトルに利用しているだけです。

1

タイポを修正

2019/07/09 23:33

投稿

magichan
magichan

スコア15898

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  import numpy as np
12
12
 
13
- import matplotlib.pyplot as pl
13
+ import matplotlib.pyplot as plt
14
14
 
15
15
 
16
16
 
@@ -34,7 +34,7 @@
34
34
 
35
35
 
36
36
 
37
- fig, axs = plt.subplots(1, len(grouped_df)) 
37
+ fig, axs = plt.subplots(1, len(grouped_df))
38
38
 
39
39
 
40
40