質問編集履歴
6
関数make_graph_saveの内容を変更いたしました
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の内容を変更いたしました
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(
|
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(
|
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=
|
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(
|
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(
|
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
画像の挿入
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_様からご指摘いただいた点を修正しました.
test
CHANGED
File without changes
|
test
CHANGED
@@ -182,7 +182,7 @@
|
|
182
182
|
|
183
183
|
#A1からHの最後の行までを格納
|
184
184
|
|
185
|
-
sheet_range=worksheet
|
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_
|
237
|
+
def make_graph_save(grade_national_ave,count_row):
|
238
|
-
|
238
|
+
|
239
|
-
for t in range(2,count_
|
239
|
+
for t in range(2,count_row+2):
|
240
240
|
|
241
241
|
for i in range(2,9):
|
242
242
|
|
2
kuma_kuma_様からご指摘いただいた点を修正しました.加えて,全ソースコードを掲載しました
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_様からご指摘いただいた点を修正しました.加えて,全ソースコードを掲載しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -4,19 +4,19 @@
|
|
4
4
|
|
5
5
|
pythonで
|
6
6
|
|
7
|
-
以下のような元のExcelデータ(
|
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
|
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(
|
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
|
-
|
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(
|
243
|
+
for i in range(2,9):
|
94
244
|
|
95
245
|
plt.figure(figsize=(5.5,2)) #グラフを描くキャンバスを作成,サイズ指定込み
|
96
246
|
|
97
|
-
|
247
|
+
y_axis=[grade_national_ave[i],event_ave[i],worksheet.cell(row=t,column=i).value]
|
98
|
-
|
248
|
+
|
99
|
-
plt.barh(
|
249
|
+
plt.barh(x_axis,y_axis,tick_label=x_labels)
|
100
|
-
|
250
|
+
|
101
|
-
plt.title(worksheet
|
251
|
+
plt.title(worksheet.cell(row=1,column=i).value,loc="center")
|
102
|
-
|
252
|
+
|
103
|
-
plt.savefig("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet
|
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
|
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ファイル(i
|
261
|
+
#openpyxlで元のExcelファイル(original_file_path)読み込み
|
112
|
-
|
262
|
+
|
113
|
-
workbook=op.load_workbook(i
|
263
|
+
workbook=op.load_workbook(original_file_path)
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
264
|
+
|
118
|
-
|
265
|
+
|
266
|
+
|
119
|
-
df_count0=(df0.iloc[:,
|
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
|
-
|
278
|
+
|
130
|
-
|
131
|
-
|
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
|
-
|
284
|
+
|
142
|
-
|
143
|
-
|
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ファイル(
|
293
|
+
#新しく作ったExcelファイル(new_file_path)にグラフを出力
|
154
|
-
|
294
|
+
|
155
|
-
df_
|
295
|
+
combined_df_row_count_for_graph=combined_df_row_count+7 #d少し下に表示したいため+7
|
156
|
-
|
296
|
+
|
157
|
-
workbook=op.load_workbook(
|
297
|
+
workbook=op.load_workbook(new_file_path)
|
298
|
+
|
158
|
-
|
299
|
+
j=2
|
300
|
+
|
159
|
-
for t in range(2,df_
|
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
|
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,
|
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_
|
311
|
+
combined_df_row_count_for_graph+=13 #グラフ出力の行位置をずらす
|
168
|
-
|
169
|
-
|
170
|
-
|
312
|
+
|
313
|
+
|
314
|
+
|
171
|
-
workbook.save(
|
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(
|
327
|
+
しかし,plt.barh(x_axis,y_axis,tick_label=x_labels)
|
184
328
|
|
185
329
|
の部分を指摘され,同じエラーが発生しました
|
186
330
|
|