Excelデータからグラフを複数作成とExcelに表示
pythonで
以下のような元のExcelデータ(同じようなシートが3つある)を縦に結合して新たなファイルを作成しました
名前 往復走 立ち幅跳び ボール投げ 反復横跳び 長座体前屈 体支持持続時間 握力
a 51 83 65 67 65 68 61
b 37 22 63 46 73 79 43
c 60 73 61 15 59 71 5
d 66 79 52 92 80 67 26
e 5 19 36 5 39 44 9
新たなファイル上にグラフを複数作成したいです
関数を使って作ろうとしています
subplotsを使用しないで,一つずつグラフ化したいです
それらをExcel上に横に7つ表示させ,人数分縦に繰り返し表示させたいです
エラーの原因,修正の仕方がわからず困っています
どなたか教えていただけないでしょうか?
発生している問題・エラーメッセージ
UFuncTypeError: ufunc 'add' did not contain a loop with signature matching types (dtype('<U11'), dtype('<U11')) -> dtype('<U11') make_graph_save(third_national_ave,df_row_count0) plt.barh(x_axis,y_axis,tick_label=x_labels) の2か所が指摘されました
該当のソースコード
python
1#各ライブラリを使用可能に 2import openpyxl as op 3import pandas as pd 4 5file_name="example" #保存した元のファイルの名前を入れる 6original_file_path="C:\Users\####\Desktop\Python test\"+file_name+".xlsx" #元のファイルのパス 7excel_sheet1_name="年長" #1つ目のシート名 8excel_sheet2_name="年中" #2つ目のシート名 9excel_sheet3_name="年少" #3つ目のシート名 10new_file_path="C:\Users\####\Desktop\Python test\output\"+file_name+"_after.xlsx" #新しく作るファイル名,"ファイル名_after.xlxs"となる 11 12#各シートを読み込み,input_sheetに代入 13df0=pd.read_excel(original_file_path, sheet_name=excel_sheet1_name,index_col=0) 14input_sheet0=df0[["往復走","立ち幅跳び","ボール投げ","反復横跳び","長座体前屈","体支持持続時間","握力"]] 15df1=pd.read_excel(original_file_path, sheet_name=excel_sheet2_name,index_col=0) 16input_sheet1=df1[["往復走","立ち幅跳び","ボール投げ","反復横跳び","長座体前屈","体支持持続時間","握力"]] 17df2=pd.read_excel(original_file_path, sheet_name=excel_sheet3_name,index_col=0) 18input_sheet2=df2[["往復走","立ち幅跳び","ボール投げ","反復横跳び","長座体前屈","体支持持続時間","握力"]] 19 20combined_df=pd.concat([input_sheet0,input_sheet1,input_sheet2]) #”名前”をインデックスに上記のシートを縦に結合,一つのシートに3つのシートを貼付 21combined_df.to_excel(new_file_path) #結合したファイルを"ファイル名_after.xlxs"としてDesktopにあるPython testのoutputファイルに保存 22 23combined_df_row_count=(combined_df.iloc[:,0]).count() #0列目(Excel上A列目)の人数(総数)を数える,ilocは0から 24 25workbook=op.load_workbook(new_file_path) #openpyxlでExcelファイル読み込み 26worksheet=workbook.worksheets[0] #編集したいシート番号の指定 27 28#平均値を算出,新しく作ったExcelファイルに表示 29from numpy import average 30worksheet.cell(row=combined_df_row_count+3,column=1).value="種目平均" #”種目平均”(文字列)をExcel内に出力 31j=2 32event_ave=[] #種目平均を入れるリスト 33for i in range(0,7): #indexを抜かした列から,0=B列になる 34 worksheet.cell(row=combined_df_row_count+3,column=j).value=average(combined_df.iloc[:,i]).round(1) #各種目平均をExcel内に出力 35 event_ave.append(average(combined_df.iloc[:,i]).round(1)) #各種目の平均を2~8列目の順でリストに追加 36 j+=1 37 38#全国平均をリストに代入 39third_national_ave=[8.5,105,5,13,28.4,58,7] #全国平均を種目順に入力,third=年長,second=年中,first=年少 40second_national_ave=[4,10,7,36,22,17,5] 41first_national_ave=[10,7,32,113,14,45,6] 42#文字列をExcel内に出力 43worksheet.cell(row=combined_df_row_count+4,column=1).value="全国平均(年長)" 44worksheet.cell(row=combined_df_row_count+5,column=1).value="全国平均(年中)" 45worksheet.cell(row=combined_df_row_count+6,column=1).value="全国平均(年少)" 46#全国平均をExcel内に出力 47j=2 48for i in range(0,7): 49 worksheet.cell(row=combined_df_row_count+4,column=j).value=third_national_ave[i] 50 worksheet.cell(row=combined_df_row_count+5,column=j).value=second_national_ave[i] 51 worksheet.cell(row=combined_df_row_count+6,column=j).value=first_national_ave[i] 52 j+=1 53 54#関数,クラスをインポート 55from openpyxl.styles import Font #フォントの書体やサイズ変更の関数 56from openpyxl.styles.alignment import Alignment #セルの文字の配置を調整する関数 57from openpyxl.drawing.image import Image #画像ファイルを挿入するクラス 58 59font=Font(name="メイリオ", size=12) #フォントをメイリオ,文字サイズを12に変更 60#A1からHの最後の行までを格納 61sheet_range=worksheet.iter_rows(min_row=1,min_col=1,max_row=worksheet.max_row,max_col=worksheet.max_column) #指定範囲を格納 62#セルをのフォント,文字サイズを一つずつ変更 63for row in sheet_range: 64 for cell in row: 65 worksheet[cell.coordinate].font=font 66 67#セルの列幅を調整 68for col in ["C","D","E","F"]: 69 worksheet.column_dimensions[col].width=14 70worksheet.column_dimensions["A"].width=16 71worksheet.column_dimensions["B"].width=10 72worksheet.column_dimensions["G"].width=19 73worksheet.column_dimensions["H"].width=9 74 75#すべて(A~H列)を中央寄せ 76for i in range(1,9): 77 for t in range(1,combined_df_row_count+7): 78 worksheet.cell(row=t,column=i).alignment=Alignment(horizontal="center") 79 80import matplotlib.pyplot as plt #matplotlibをpltとして使用可能に 81plt.rcParams["font.family"]="MS Gothic" #日本語表記を可能に 82 83x_labels=["全国平均","園の平均","記録"] #各棒グラフの名前を入力(x軸側に表示用) 84x_axis=[1,2,3] 85 86import numpy as np 87#グラフを作成,保存する関数 88def make_graph_save(grade_national_ave,count_row): 89 for t in range(2,count_row+2): 90 j=2 91 for i in range(0,7): 92 plt.figure(figsize=(5.5,2)) #グラフを描くキャンバスを作成,サイズ指定込み 93 x_labels=np.array(['全国平均','園の平均','記録']) 94 x_axis=np.arange(len(x_labels)) 95 y_axis=np.array([grade_national_ave[i],event_ave[i],worksheet.cell(t,j).value]) # y軸 96 plt.barh(x_axis,y_axis,tick_label=x_labels) 97 plt.title(worksheet.cell(row=1,column=j).value,loc="center") 98 plt.show() 99 plt.savefig("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet.cell(t,1).value+"_"+worksheet.cell(1,j).value+".png", dpi=100) 100 img=Image("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet.cell(t,1).value+"_"+worksheet.cell(1,j).value+".png") 101 plt.close() 102 j+=1 103 104#openpyxlで元のExcelファイル(original_file_path)読み込み 105workbook=op.load_workbook(original_file_path) 106 107df_row_count0=(df0.iloc[:,0]).count() #元のExcelファイルのシート1のデータの総数を数える 108df_row_count1=(df1.iloc[:,0]).count() #元のExcelファイルのシート2のデータの総数を数える 109df_row_count2=(df2.iloc[:,0]).count() #元のExcelファイルのシート3のデータの総数を数える 110 111worksheet=workbook.worksheets[0] #操作したいシートを読み込み 112make_graph_save(third_national_ave,df_row_count0) 113 114worksheet=workbook.worksheets[1] #操作したいシートを読み込み 115make_graph_save(second_national_ave,df_row_count1) 116 117worksheet=workbook.worksheets[2] #操作したいシートを読み込み 118make_graph_save(first_national_ave,df_row_count2) 119 120#新しく作ったExcelファイル(new_file_path)にグラフを出力 121combined_df_row_count_for_graph=combined_df_row_count+7 #d少し下に表示したいため+7 122workbook=op.load_workbook(new_file_path) 123j=2 124for t in range(2,combined_df_row_count+2): 125 for i in range(0,7): 126 img=Image("C:\Users\####\Pictures\Saved Pictures\graph_"+worksheet.cell(row=t,column=1).value+"_"+worksheet.cell(row=1,column=i).value+".png") #横に7つのグラフを表示 127 worksheet.add_image(img,(worksheet.cell(row=combined_df_row_count_for_graph,column=j).value)) 128 j+=8 129 combined_df_row_count_for_graph+=13 #グラフ出力の行位置をずらす 130 131workbook.save(new_file_path)
試したこと
関数を使わない方法を試しました
しかし,plt.barh(x_axis,y_axis,tick_label=x_labels)
の部分を指摘され,同じエラーが発生しました
補足情報(FW/ツールのバージョンなど)
あなたの回答
tips
プレビュー