PythonでExcelから取得したデータからグラフ画像を生成PythonPythonを日常的に使うようになって、2か月*1が経過しました。馴染んできたので、何か作業の練習をしてみることにします。はじめに私にとってのPythonは、ツールとしてはほぼ定着したと思います。(アプリ開発はまだ勉強しないと無理。「複数のExcelファイルからデータを取得して、グラフをプロットして画像として保存」というのをやってみます。グラフの使い方はテキトーです。Excelを使っているのは、Excelを使う人にもPython便利!と思ってもらう目論見があったり無かったり。v4.0.0使用モジュールバージョンは省略。Anacondaがあればこれらが全部使えるところが良いですね。グラフのプロット(ファイル書き出しまで)Numpyやpandasモジュールを使ったほうが良さそうなところもありますが、今回は見送ります。*.xlsxファイルのデータを元に、それぞれのファイルごとのグラフ画像(PNG)を作る画像ファイル名は、Excelファイル名を元に作るグラフはデータに記載している種類で作成(棒/円/散布図)詳細は実装のところで。FontPropertiesエントリーポイント引数に入力ディレクトリーと出力ディレクトリーを取る関数を定義します。dstdir)「Excelファイルのリストを取得する」関数で取得したリストをイテレートし、それぞれ「グラフを作成&保存する」関数に渡します。任意のフォルダーからExcelファイルを全部取得srcにあるExcelファイルを取得して文字列リストにします。globモジュールを使用します。'/*.xlsx')Excelからデータを取得xlrdモジュールを使って、Excelからデータを取得します。シートは常に先頭のものを対象にします。セルA1にグラフ種類を記載しているので、それを取得します。A1セルシート名をグラフのタイトルにします。日本語の場合はFontPropertiesを設定する必要があります。fontproperties=fp)xlrdが返すリストはセルオブジェクトのリストなので、値リストに変換する内部関数を定義しておきます。cells]セルA1のグラフ種類がbar,pie,scatterのどれかであれば、対応するグラフを描画します。いずれにも該当しなければ、警告メッセージを出力してそのファイルはスキップします。returnbarの場合は、B,Cの2列を取得して、それぞれ種類と量とし、種類ごとに合算した値を算出します。pieの場合は、B列を取得して、値の出現割合を算出します。scatterの場合は、B,C,Dの3列を取得して、それぞれx軸、y軸、点の大きさとします。各グラフのラベルは省略または最小限にしています。ちなみに、matplotlib.pyplotに渡すデータは、イテレート可能なものであればたいてい何でも渡せます。chart)集計は辞書を作ってループで足しこんでいます。ソート順は種類の名前順です。chart)出現割合の算出は、今回はcollectionsモジュールのCounterを使っています。データは割合が少ない順にします。デフォルトでは3時の位置から開始するので、startangle=90を指定すると、我々が良く目にする円グラフになります。plot)X軸とY軸のそれぞれの配列を渡すだけです。後から色の指定も追加(D列)してみました。画像の種類は拡張子で自動判別されるので、ファイル名さえ決めればOK。Excelファイル名のピリオドをアンダースコア(_)にして(しなくても良い)、末尾に.pngをつけることにします。'.png'プロットしたグラフを画像に保存plt.savefigするだけです。※50%縮小しています。おわりにまだ分からないことばかりで調べながら書いていたら一日かかりましたが、ツールが充実しているのでそれほど苦になりませんでした。今回のコードはPyCharmで書いたんですが、Java+IDEと同じ感覚で書けるので快適です。notebookを使いました。以上、Pythonはツールとして大変使いやすいと改めて思いました。最後までお読みいただきましてありがとうございました。PythonでExcelから取得したデータからグラフ画像を生成Tweet広告を非表示にする関連記事2017-08-21ExcelVBAで同じ名前のシートを1つのファイルにまとめるマクロまただいぶ間が空いてしまいました。(2)プロフィールid:argiusはてなブログをはじめよう!argiusさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。