質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.34%

Excelデータからグラフを複数作成とExcelに表示

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 637

hiro3110

score 2

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か所が指摘されました

該当のソースコード

#各ライブラリを使用可能に
import openpyxl as op
import pandas as pd

file_name="example" #保存した元のファイルの名前を入れる
original_file_path="C:\\Users\\####\\Desktop\\Python test\\"+file_name+".xlsx" #元のファイルのパス
excel_sheet1_name="年長" #1つ目のシート名
excel_sheet2_name="年中" #2つ目のシート名
excel_sheet3_name="年少" #3つ目のシート名
new_file_path="C:\\Users\\####\\Desktop\\Python test\\output\\"+file_name+"_after.xlsx" #新しく作るファイル名,"ファイル名_after.xlxs"となる

#各シートを読み込み,input_sheetに代入
df0=pd.read_excel(original_file_path, sheet_name=excel_sheet1_name,index_col=0)
input_sheet0=df0[["往復走","立ち幅跳び","ボール投げ","反復横跳び","長座体前屈","体支持持続時間","握力"]]
df1=pd.read_excel(original_file_path, sheet_name=excel_sheet2_name,index_col=0)
input_sheet1=df1[["往復走","立ち幅跳び","ボール投げ","反復横跳び","長座体前屈","体支持持続時間","握力"]]
df2=pd.read_excel(original_file_path, sheet_name=excel_sheet3_name,index_col=0)
input_sheet2=df2[["往復走","立ち幅跳び","ボール投げ","反復横跳び","長座体前屈","体支持持続時間","握力"]]

combined_df=pd.concat([input_sheet0,input_sheet1,input_sheet2]) #”名前”をインデックスに上記のシートを縦に結合,一つのシートに3つのシートを貼付
combined_df.to_excel(new_file_path) #結合したファイルを"ファイル名_after.xlxs"としてDesktopにあるPython testのoutputファイルに保存

combined_df_row_count=(combined_df.iloc[:,0]).count() #0列目(Excel上A列目)の人数(総数)を数える,ilocは0から

workbook=op.load_workbook(new_file_path) #openpyxlでExcelファイル読み込み
worksheet=workbook.worksheets[0] #編集したいシート番号の指定

#平均値を算出,新しく作ったExcelファイルに表示
from numpy import average 
worksheet.cell(row=combined_df_row_count+3,column=1).value="種目平均" #”種目平均”(文字列)をExcel内に出力
j=2
event_ave=[] #種目平均を入れるリスト
for i in range(0,7): #indexを抜かした列から,0=B列になる
    worksheet.cell(row=combined_df_row_count+3,column=j).value=average(combined_df.iloc[:,i]).round(1) #各種目平均をExcel内に出力
    event_ave.append(average(combined_df.iloc[:,i]).round(1)) #各種目の平均を2~8列目の順でリストに追加
    j+=1

#全国平均をリストに代入
third_national_ave=[8.5,105,5,13,28.4,58,7] #全国平均を種目順に入力,third=年長,second=年中,first=年少
second_national_ave=[4,10,7,36,22,17,5]
first_national_ave=[10,7,32,113,14,45,6]
#文字列をExcel内に出力
worksheet.cell(row=combined_df_row_count+4,column=1).value="全国平均(年長)"
worksheet.cell(row=combined_df_row_count+5,column=1).value="全国平均(年中)"
worksheet.cell(row=combined_df_row_count+6,column=1).value="全国平均(年少)"
#全国平均をExcel内に出力
j=2
for i in range(0,7):
    worksheet.cell(row=combined_df_row_count+4,column=j).value=third_national_ave[i]
    worksheet.cell(row=combined_df_row_count+5,column=j).value=second_national_ave[i]
    worksheet.cell(row=combined_df_row_count+6,column=j).value=first_national_ave[i]
    j+=1

#関数,クラスをインポート
from openpyxl.styles import Font #フォントの書体やサイズ変更の関数
from openpyxl.styles.alignment import Alignment #セルの文字の配置を調整する関数
from openpyxl.drawing.image import Image #画像ファイルを挿入するクラス

font=Font(name="メイリオ", size=12) #フォントをメイリオ,文字サイズを12に変更
#A1からHの最後の行までを格納
sheet_range=worksheet.iter_rows(min_row=1,min_col=1,max_row=worksheet.max_row,max_col=worksheet.max_column) #指定範囲を格納
#セルをのフォント,文字サイズを一つずつ変更
for row in sheet_range:
    for cell in row:
        worksheet[cell.coordinate].font=font

#セルの列幅を調整
for col in ["C","D","E","F"]:
    worksheet.column_dimensions[col].width=14
worksheet.column_dimensions["A"].width=16
worksheet.column_dimensions["B"].width=10
worksheet.column_dimensions["G"].width=19
worksheet.column_dimensions["H"].width=9

#すべて(A~H列)を中央寄せ
for i in range(1,9):
    for t in range(1,combined_df_row_count+7):
        worksheet.cell(row=t,column=i).alignment=Alignment(horizontal="center")

import matplotlib.pyplot as plt #matplotlibをpltとして使用可能に
plt.rcParams["font.family"]="MS Gothic" #日本語表記を可能に

x_labels=["全国平均","園の平均","記録"] #各棒グラフの名前を入力(x軸側に表示用)
x_axis=[1,2,3]

import numpy as np
#グラフを作成,保存する関数
def make_graph_save(grade_national_ave,count_row):
    for t in range(2,count_row+2):
        j=2
        for i in range(0,7):
            plt.figure(figsize=(5.5,2)) #グラフを描くキャンバスを作成,サイズ指定込み
            x_labels=np.array(['全国平均','園の平均','記録'])
            x_axis=np.arange(len(x_labels))
            y_axis=np.array([grade_national_ave[i],event_ave[i],worksheet.cell(t,j).value]) # y軸
            plt.barh(x_axis,y_axis,tick_label=x_labels)
            plt.title(worksheet.cell(row=1,column=j).value,loc="center") 
            plt.show()             
            plt.savefig("C:\\Users\\####\\Pictures\\Saved Pictures\\graph_"+worksheet.cell(t,1).value+"_"+worksheet.cell(1,j).value+".png", dpi=100)
            img=Image("C:\\Users\\####\\Pictures\\Saved Pictures\\graph_"+worksheet.cell(t,1).value+"_"+worksheet.cell(1,j).value+".png")
            plt.close()
            j+=1

#openpyxlで元のExcelファイル(original_file_path)読み込み
workbook=op.load_workbook(original_file_path)

df_row_count0=(df0.iloc[:,0]).count() #元のExcelファイルのシート1のデータの総数を数える
df_row_count1=(df1.iloc[:,0]).count() #元のExcelファイルのシート2のデータの総数を数える
df_row_count2=(df2.iloc[:,0]).count() #元のExcelファイルのシート3のデータの総数を数える

worksheet=workbook.worksheets[0] #操作したいシートを読み込み
make_graph_save(third_national_ave,df_row_count0)

worksheet=workbook.worksheets[1] #操作したいシートを読み込み
make_graph_save(second_national_ave,df_row_count1)

worksheet=workbook.worksheets[2] #操作したいシートを読み込み
make_graph_save(first_national_ave,df_row_count2)

#新しく作ったExcelファイル(new_file_path)にグラフを出力
combined_df_row_count_for_graph=combined_df_row_count+7 #d少し下に表示したいため+7
workbook=op.load_workbook(new_file_path)
j=2
for t in range(2,combined_df_row_count+2):
    for i in range(0,7):      
        img=Image("C:\\Users\\####\\Pictures\\Saved Pictures\\graph_"+worksheet.cell(row=t,column=1).value+"_"+worksheet.cell(row=1,column=i).value+".png") #横に7つのグラフを表示
        worksheet.add_image(img,(worksheet.cell(row=combined_df_row_count_for_graph,column=j).value))
        j+=8
    combined_df_row_count_for_graph+=13 #グラフ出力の行位置をずらす

workbook.save(new_file_path)

試したこと

関数を使わない方法を試しました
しかし,plt.barh(x_axis,y_axis,tick_label=x_labels)
の部分を指摘され,同じエラーが発生しました

補足情報(FW/ツールのバージョンなど)

最近始めたばかりなので,最新だと思います
windowsを使っています
イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • kuma_kuma_

    2020/10/04 17:07

    これはアドバイスとして書きますので聞き流されても良いです。

    質問者様の中には「この様なグラフを作りたい」というイメージが完全にできているように思います。
    これはプログラムする際とても重要です。

    今回「subplots」を選ばれましたが多分イメージを具体化するのに手間がかかりすぎている
    その為本筋のことができなく感じています。

    そうすると先にかきましたが手動で「Excelで一度イメージしたグラフを作成」する事をオススメします。

    あとはそのグラフを
    「ExcelだからExcelのグラフ機能を使う」
    →あとから数値変更等行える。どのような表現ができるかダイレクトに確認できる。

    「Pythonだからこそsubplotsを使う」
    →変更できない事も利点の一つ。また表現力もsubplotsでしかできない事もある。
    またPythonの学習の意味もあるならこちらの方法でしょう。

    利点欠点両方に存在します。それを踏まえた上で選択されてはいかがでしょうか?

    キャンセル

  • hiro3110

    2020/10/04 17:15

    アドバイス感謝いたします
    グラフ作成を一から行いたいと思います
    また問題がありましたら,teratail上で質問いたします
    機会がありましたら,またご教授よろしくお願いいたします
    毎度ご丁寧に返信いただきありがとうございました
    同時に,多くのことを学ぶこともできました
    誠にありがとうございます

    キャンセル

  • kuma_kuma_

    2020/10/04 17:29

    いいえ、一度で回答すると質問者様が「丸投げ質問」しちゃいけないのに
    回答者が「丸投げ回答」するのもおかしな話ですから。

    意地悪に見えたかもしれませんが経験も学習の内でその機会をなくしたくなく
    この様な長い説明となりました。
    きちんと作りたいイメージがあることは素晴らしい資質です。頑張ってみて下さい。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る