質問編集履歴

6

関数make_graph_saveの内容を変更いたしました

2020/10/04 07:24

投稿

hiro3110
hiro3110

スコア2

test CHANGED
File without changes
test CHANGED
@@ -232,6 +232,8 @@
232
232
 
233
233
 
234
234
 
235
+ import numpy as np
236
+
235
237
  #グラフを作成,保存する関数
236
238
 
237
239
  def make_graph_save(grade_national_ave,count_row):

5

関数make_graph_saveの内容を変更いたしました

2020/10/04 07:24

投稿

hiro3110
hiro3110

スコア2

test CHANGED
File without changes
test CHANGED
@@ -238,22 +238,32 @@
238
238
 
239
239
  for t in range(2,count_row+2):
240
240
 
241
+ j=2
242
+
241
- for i in range(2,9):
243
+ for i in range(0,7):
242
244
 
243
245
  plt.figure(figsize=(5.5,2)) #グラフを描くキャンバスを作成,サイズ指定込み
244
246
 
247
+ x_labels=np.array(['全国平均','園の平均','記録'])
248
+
249
+ x_axis=np.arange(len(x_labels))
250
+
245
- y_axis=[grade_national_ave[i],event_ave[i],worksheet.cell(row=t,column=i).value]
251
+ y_axis=np.array([grade_national_ave[i],event_ave[i],worksheet.cell(t,j).value]) # y軸
246
252
 
247
253
  plt.barh(x_axis,y_axis,tick_label=x_labels)
248
254
 
249
- plt.title(worksheet.cell(row=1,column=i).value,loc="center")
255
+ plt.title(worksheet.cell(row=1,column=j).value,loc="center")
256
+
250
-
257
+ plt.show()
258
+
251
- plt.savefig("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet.cell(row=t,column=1).value+"_"+worksheet.cell(row=1,column=i).value+".png", dpi=100)
259
+ plt.savefig("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet.cell(t,1).value+"_"+worksheet.cell(1,j).value+".png", dpi=100)
252
-
260
+
253
- img=Image("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet.cell(row=t,column=1).value+"_"+worksheet.cell(row=1,column=i).value+".png")
261
+ img=Image("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet.cell(t,1).value+"_"+worksheet.cell(1,j).value+".png")
254
262
 
255
263
  plt.close()
256
264
 
265
+ j+=1
266
+
257
267
 
258
268
 
259
269
  #openpyxlで元のExcelファイル(original_file_path)読み込み

4

画像の挿入

2020/10/04 07:23

投稿

hiro3110
hiro3110

スコア2

test CHANGED
File without changes
test CHANGED
@@ -335,3 +335,5 @@
335
335
  最近始めたばかりなので,最新だと思います
336
336
 
337
337
  windowsを使っています
338
+
339
+ ![イメージ説明](bf6b8752d575db3dc11c9167ffedaa1d.png)

3

kuma_kuma_様からご指摘いただいた点を修正しました.

2020/10/04 07:14

投稿

hiro3110
hiro3110

スコア2

test CHANGED
File without changes
test CHANGED
@@ -182,7 +182,7 @@
182
182
 
183
183
  #A1からHの最後の行までを格納
184
184
 
185
- sheet_range=worksheet["A1":"H"+str(combined_df_row_count+6)] #指定範囲をタプル型で格納
185
+ sheet_range=worksheet.iter_rows(min_row=1,min_col=1,max_row=worksheet.max_row,max_col=worksheet.max_column) #指定範囲を格納
186
186
 
187
187
  #セルをのフォント,文字サイズを一つずつ変更
188
188
 
@@ -234,9 +234,9 @@
234
234
 
235
235
  #グラフを作成,保存する関数
236
236
 
237
- def make_graph_save(grade_national_ave,count_sheet):
237
+ def make_graph_save(grade_national_ave,count_row):
238
-
238
+
239
- for t in range(2,count_sheet+2):
239
+ for t in range(2,count_row+2):
240
240
 
241
241
  for i in range(2,9):
242
242
 

2

kuma_kuma_様からご指摘いただいた点を修正しました.加えて,全ソースコードを掲載しました

2020/10/04 03:46

投稿

hiro3110
hiro3110

スコア2

test CHANGED
File without changes
test CHANGED
@@ -34,8 +34,6 @@
34
34
 
35
35
  どなたか教えていただけないでしょうか?
36
36
 
37
- *結合などの前処理は省いています.なので,以下のソースコードはすべてではありません
38
-
39
37
 
40
38
 
41
39
  ### 発生している問題・エラーメッセージ

1

kuma_kuma_様からご指摘いただいた点を修正しました.加えて,全ソースコードを掲載しました

2020/10/03 15:33

投稿

hiro3110
hiro3110

スコア2

test CHANGED
File without changes
test CHANGED
@@ -4,19 +4,19 @@
4
4
 
5
5
  pythonで
6
6
 
7
- 以下のような元のExcelデータ(imp)(同じようなシートが3つある)を縦に結合して新たなファイル(save_file_name)を作成しました
7
+ 以下のような元のExcelデータ(同じようなシートが3つある)を縦に結合して新たなファイルを作成しました
8
-
8
+
9
- 名前 種目名 種目名 種目名 種目名 種目名 種目名 種目名
9
+ 名前 往復走 立ち幅跳び ボール投げ 反復横跳び 長座体前屈 体支持持続時間 握力
10
-
10
+
11
- a   51   83   65   67  65   68   61
11
+ a   51    83   65     67    65      68   61
12
-
12
+
13
- b   37   22   63   46  73   79   43
13
+ b   37    22   63     46    73      79   43
14
-
14
+
15
- c   60   73   61   15  59   71   5
15
+ c   60    73   61     15    59      71   5
16
-
16
+
17
- d   66   79   52   92  80   67   26
17
+ d   66    79   52     92    80      67   26
18
-
18
+
19
- e    5   19   36    5   39   44   9
19
+ e    5    19   36      5     39      44   9
20
20
 
21
21
 
22
22
 
@@ -24,6 +24,10 @@
24
24
 
25
25
  関数を使って作ろうとしています
26
26
 
27
+ subplotsを使用しないで,一つずつグラフ化したいです
28
+
29
+ それらをExcel上に横に7つ表示させ,人数分縦に繰り返し表示させたいです
30
+
27
31
 
28
32
 
29
33
  エラーの原因,修正の仕方がわからず困っています
@@ -44,9 +48,9 @@
44
48
 
45
49
 
46
50
 
47
- make_graph(third_national_ave,df_count0)
51
+ make_graph_save(third_national_ave,df_row_count0)
48
-
52
+
49
- plt.barh(left,height,tick_label=labels)
53
+ plt.barh(x_axis,y_axis,tick_label=x_labels)
50
54
 
51
55
  の2か所が指摘されました
52
56
 
@@ -60,115 +64,255 @@
60
64
 
61
65
  ```python
62
66
 
67
+ #各ライブラリを使用可能に
68
+
63
69
  import openpyxl as op
64
70
 
71
+ import pandas as pd
72
+
73
+
74
+
75
+ file_name="example" #保存した元のファイルの名前を入れる
76
+
77
+ original_file_path="C:\Users\####\Desktop\Python test\"+file_name+".xlsx" #元のファイルのパス
78
+
79
+ excel_sheet1_name="年長" #1つ目のシート名
80
+
81
+ excel_sheet2_name="年中" #2つ目のシート名
82
+
83
+ excel_sheet3_name="年少" #3つ目のシート名
84
+
85
+ new_file_path="C:\Users\####\Desktop\Python test\output\"+file_name+"_after.xlsx" #新しく作るファイル名,"ファイル名_after.xlxs"となる
86
+
87
+
88
+
89
+ #各シートを読み込み,input_sheetに代入
90
+
91
+ df0=pd.read_excel(original_file_path, sheet_name=excel_sheet1_name,index_col=0)
92
+
93
+ input_sheet0=df0[["往復走","立ち幅跳び","ボール投げ","反復横跳び","長座体前屈","体支持持続時間","握力"]]
94
+
95
+ df1=pd.read_excel(original_file_path, sheet_name=excel_sheet2_name,index_col=0)
96
+
97
+ input_sheet1=df1[["往復走","立ち幅跳び","ボール投げ","反復横跳び","長座体前屈","体支持持続時間","握力"]]
98
+
99
+ df2=pd.read_excel(original_file_path, sheet_name=excel_sheet3_name,index_col=0)
100
+
101
+ input_sheet2=df2[["往復走","立ち幅跳び","ボール投げ","反復横跳び","長座体前屈","体支持持続時間","握力"]]
102
+
103
+
104
+
105
+ combined_df=pd.concat([input_sheet0,input_sheet1,input_sheet2]) #”名前”をインデックスに上記のシートを縦に結合,一つのシートに3つのシートを貼付
106
+
107
+ combined_df.to_excel(new_file_path) #結合したファイルを"ファイル名_after.xlxs"としてDesktopにあるPython testのoutputファイルに保存
108
+
109
+
110
+
111
+ combined_df_row_count=(combined_df.iloc[:,0]).count() #0列目(Excel上A列目)の人数(総数)を数える,ilocは0から
112
+
113
+
114
+
115
+ workbook=op.load_workbook(new_file_path) #openpyxlでExcelファイル読み込み
116
+
117
+ worksheet=workbook.worksheets[0] #編集したいシート番号の指定
118
+
119
+
120
+
121
+ #平均値を算出,新しく作ったExcelファイルに表示
122
+
123
+ from numpy import average
124
+
125
+ worksheet.cell(row=combined_df_row_count+3,column=1).value="種目平均" #”種目平均”(文字列)をExcel内に出力
126
+
127
+ j=2
128
+
129
+ event_ave=[] #種目平均を入れるリスト
130
+
131
+ for i in range(0,7): #indexを抜かした列から,0=B列になる
132
+
133
+ worksheet.cell(row=combined_df_row_count+3,column=j).value=average(combined_df.iloc[:,i]).round(1) #各種目平均をExcel内に出力
134
+
135
+ event_ave.append(average(combined_df.iloc[:,i]).round(1)) #各種目の平均を2~8列目の順でリストに追加
136
+
137
+ j+=1
138
+
139
+
140
+
141
+ #全国平均をリストに代入
142
+
143
+ third_national_ave=[8.5,105,5,13,28.4,58,7] #全国平均を種目順に入力,third=年長,second=年中,first=年少
144
+
145
+ second_national_ave=[4,10,7,36,22,17,5]
146
+
147
+ first_national_ave=[10,7,32,113,14,45,6]
148
+
149
+ #文字列をExcel内に出力
150
+
151
+ worksheet.cell(row=combined_df_row_count+4,column=1).value="全国平均(年長)"
152
+
153
+ worksheet.cell(row=combined_df_row_count+5,column=1).value="全国平均(年中)"
154
+
155
+ worksheet.cell(row=combined_df_row_count+6,column=1).value="全国平均(年少)"
156
+
157
+ #全国平均をExcel内に出力
158
+
159
+ j=2
160
+
161
+ for i in range(0,7):
162
+
163
+ worksheet.cell(row=combined_df_row_count+4,column=j).value=third_national_ave[i]
164
+
165
+ worksheet.cell(row=combined_df_row_count+5,column=j).value=second_national_ave[i]
166
+
167
+ worksheet.cell(row=combined_df_row_count+6,column=j).value=first_national_ave[i]
168
+
169
+ j+=1
170
+
171
+
172
+
173
+ #関数,クラスをインポート
174
+
175
+ from openpyxl.styles import Font #フォントの書体やサイズ変更の関数
176
+
177
+ from openpyxl.styles.alignment import Alignment #セルの文字の配置を調整する関数
178
+
179
+ from openpyxl.drawing.image import Image #画像ファイルを挿入するクラス
180
+
181
+
182
+
183
+ font=Font(name="メイリオ", size=12) #フォントをメイリオ,文字サイズを12に変更
184
+
185
+ #A1からHの最後の行までを格納
186
+
187
+ sheet_range=worksheet["A1":"H"+str(combined_df_row_count+6)] #指定範囲をタプル型で格納
188
+
189
+ #セルをのフォント,文字サイズを一つずつ変更
190
+
191
+ for row in sheet_range:
192
+
193
+ for cell in row:
194
+
195
+ worksheet[cell.coordinate].font=font
196
+
197
+
198
+
199
+ #セルの列幅を調整
200
+
201
+ for col in ["C","D","E","F"]:
202
+
203
+ worksheet.column_dimensions[col].width=14
204
+
205
+ worksheet.column_dimensions["A"].width=16
206
+
207
+ worksheet.column_dimensions["B"].width=10
208
+
209
+ worksheet.column_dimensions["G"].width=19
210
+
211
+ worksheet.column_dimensions["H"].width=9
212
+
213
+
214
+
215
+ #すべて(A~H列)を中央寄せ
216
+
217
+ for i in range(1,9):
218
+
219
+ for t in range(1,combined_df_row_count+7):
220
+
221
+ worksheet.cell(row=t,column=i).alignment=Alignment(horizontal="center")
222
+
223
+
224
+
65
- import matplotlib.pyplot as plt
225
+ import matplotlib.pyplot as plt #matplotlibをpltとして使用可能に
66
226
 
67
227
  plt.rcParams["font.family"]="MS Gothic" #日本語表記を可能に
68
228
 
69
229
 
70
230
 
71
- third_national_ave=[8.5,105,5,13,28.4,58,7]
72
-
73
- second_national_ave=[1,2,3,4,5,6,7]
74
-
75
- first_national_ave=[10,11,12,13,14,15,16]
76
-
77
-
78
-
79
- labels=["","",""] #ラベルを入力
231
+ x_labels=["全国平均","園の平均","記録"] #各棒グフの名前を入力(x軸側に表示用)
80
-
232
+
81
- left =[1,2,3]
233
+ x_axis=[1,2,3]
82
-
83
- col=["B","G","N","V","AD","AL","AT"] #グラフを出力する列
84
234
 
85
235
 
86
236
 
87
237
  #グラフを作成,保存する関数
88
238
 
89
- def make_graph(grade_national_ave,count_sheet):
239
+ def make_graph_save(grade_national_ave,count_sheet):
90
240
 
91
241
  for t in range(2,count_sheet+2):
92
242
 
93
- for i in range(0,7):
243
+ for i in range(2,9):
94
244
 
95
245
  plt.figure(figsize=(5.5,2)) #グラフを描くキャンバスを作成,サイズ指定込み
96
246
 
97
- height=[grade_national_ave[i],ave_result[i],worksheet[moji[i]+str(t)].value]
247
+ y_axis=[grade_national_ave[i],event_ave[i],worksheet.cell(row=t,column=i).value]
98
-
248
+
99
- plt.barh(left,height,tick_label=labels)
249
+ plt.barh(x_axis,y_axis,tick_label=x_labels)
100
-
250
+
101
- plt.title(worksheet[moji[i]+str(1)].value,loc="center")
251
+ plt.title(worksheet.cell(row=1,column=i).value,loc="center")
102
-
252
+
103
- plt.savefig("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet["A"+str(t)].value+"_"+worksheet[moji[i]+str(1)].value+".png", dpi=100)
253
+ plt.savefig("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet.cell(row=t,column=1).value+"_"+worksheet.cell(row=1,column=i).value+".png", dpi=100)
104
-
254
+
105
- img=Image("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet["A"+str(t)].value+"_"+worksheet[moji[i]+str(1)].value+".png")
255
+ img=Image("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet.cell(row=t,column=1).value+"_"+worksheet.cell(row=1,column=i).value+".png")
106
256
 
107
257
  plt.close()
108
258
 
109
259
 
110
260
 
111
- #openpyxlで元のExcelファイル(imp)読み込み
261
+ #openpyxlで元のExcelファイル(original_file_path)読み込み
112
-
262
+
113
- workbook=op.load_workbook(imp)
263
+ workbook=op.load_workbook(original_file_path)
114
-
115
-
116
-
117
- #元のExcelファイルのシート1のデータの総数を数える
264
+
118
-
265
+
266
+
119
- df_count0=(df0.iloc[:,1]).count()
267
+ df_row_count0=(df0.iloc[:,0]).count() #元のExcelファイルのシート1のデータの総数を数える
268
+
120
-
269
+ df_row_count1=(df1.iloc[:,0]).count() #元のExcelファイルのシート2のデータの総数を数える
270
+
121
-
271
+ df_row_count2=(df2.iloc[:,0]).count() #元のExcelファイルのシート3のデータの総数を数える
122
-
272
+
273
+
274
+
123
- worksheet=workbook.worksheets[0]
275
+ worksheet=workbook.worksheets[0] #操作したいシートを読み込み
124
-
276
+
125
- make_graph(third_national_ave,df_count0)
277
+ make_graph_save(third_national_ave,df_row_count0)
126
-
127
-
128
-
129
- #元のExcelファイルのシート2のデータの総数を数える
278
+
130
-
131
- df_count1=(df1.iloc[:,1]).count()
279
+
132
-
133
-
134
-
280
+
135
- worksheet=workbook.worksheets[1]
281
+ worksheet=workbook.worksheets[1] #操作したいシートを読み込み
136
-
282
+
137
- make_graph(second_national_ave,df_count1)
283
+ make_graph_save(second_national_ave,df_row_count1)
138
-
139
-
140
-
141
- #元のExcelファイルのシート3のデータの総数を数える
284
+
142
-
143
- df_count2=(df2.iloc[:,1]).count()
285
+
144
-
145
-
146
-
286
+
147
- worksheet=workbook.worksheets[2]
287
+ worksheet=workbook.worksheets[2] #操作したいシートを読み込み
148
-
288
+
149
- make_graph(first_national_ave,df_count2)
289
+ make_graph_save(first_national_ave,df_row_count2)
150
-
151
-
152
-
290
+
291
+
292
+
153
- #新しく作ったExcelファイル(save_file_name)にグラフを出力
293
+ #新しく作ったExcelファイル(new_file_path)にグラフを出力
154
-
294
+
155
- df_con_countA=df_con_count+7 #df_con_countは結合したデータの総数,少し下に表示したいため+7
295
+ combined_df_row_count_for_graph=combined_df_row_count+7 #d少し下に表示したいため+7
156
-
296
+
157
- workbook=op.load_workbook(save_file_name)
297
+ workbook=op.load_workbook(new_file_path)
298
+
158
-
299
+ j=2
300
+
159
- for t in range(2,df_con_count+2):
301
+ for t in range(2,combined_df_row_count+2):
160
302
 
161
303
  for i in range(0,7):
162
304
 
163
- img=Image("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet["A"+str(t)].value+"_"+worksheet[moji[i]+str(1)].value+".png") #横に7つのグラフを表示
305
+ img=Image("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet.cell(row=t,column=1).value+"_"+worksheet.cell(row=1,column=i).value+".png") #横に7つのグラフを表示
164
-
306
+
165
- worksheet.add_image(img,col[i]+str(df_con_countA))
307
+ worksheet.add_image(img,(worksheet.cell(row=combined_df_row_count_for_graph,column=j).value))
308
+
166
-
309
+ j+=8
310
+
167
- df_con_countA+=13 #グラフ出力の行位置をずらす
311
+ combined_df_row_count_for_graph+=13 #グラフ出力の行位置をずらす
168
-
169
-
170
-
312
+
313
+
314
+
171
- workbook.save(save_file_name)
315
+ workbook.save(new_file_path)
172
316
 
173
317
  ```
174
318
 
@@ -180,7 +324,7 @@
180
324
 
181
325
  関数を使わない方法を試しました
182
326
 
183
- しかし,plt.barh(left,height,tick_label=labels)
327
+ しかし,plt.barh(x_axis,y_axis,tick_label=x_labels)
184
328
 
185
329
  の部分を指摘され,同じエラーが発生しました
186
330