・Pythonのグラフの書き方を調べている方(日本語対応 )
・Excelデータを使ってPythonでグラフを書きたい方
・コピペでもいいので、 Excel読み込んでPythonコード書きたい方
どうもこんにちは。
今でもExcelで綺麗なグラフを作ることが苦手なコンです。
ちょっと前に
Pythonを使って Excelデータを読み込む記事を書かせていただきました。
今日はその続きで
読み込んだ Excelデータからグラフを書いていきたいと思います。
今回の目標:散布図
ずばり今回の目標は散布図作成
下のグラフみたいに、プロ野球選手の身長と体重の散布図をPython使って書いていきます。
グラフを扱うライブラリ
Python言語でコードを書く時によく使う機能が「ライブラリ」です。「ライブラリ」とは、特定の動作をする関数やクラスを一つにまとめたもので、インターネット経由で誰でも自らのPCにインストールして使うことができます。
グラフ描画を扱うライブラリはいくつかあります。
メジャーなライブラリは下の2つです。
①matplotlib
②seaborn
この2つがPythonのグラフ作成における、角さんと助さん的なポジションのライブラリ
でもseabornはmatpoltlib使っているから、実質matplotlibが強い。
でも今回は
②seabornをメインに書きたいと思います。
理由は2つ!!
①整ったデザインのグラフを描くことができる
②matplotlibと比べて少ないコードで図が描ける
Excelで書くよりも整ったグラフを
10行くらいのコードで作成できるため非常におすすめです。
seabornのインストール
一番確実にインストールする方法は、公式HPを参照!!
なんですが 書いていきますよ。
最初に注意事項!!
※seabornを利用するためには、Pythonのバージョンは3.6以上!!
Pythonのバージョンを確認したらインストールに進みましょう。
まずインストールするためには
以下のコードをコマンドプロンプトもしくはターミナルで実行してください。
pip install seaborn
このコードを実行すると
・numpy
・scipy
・pandas
・matplotlib
がインストールされますが、おかいなく。
seabornを使ったPythonコード
ここまで、インストールだけで大変だったかもしれませんが
Pythonコード書いていきます。
使用した Excelデータ
正直なんでも良かったんですが
今回も千葉商科大学さん(https://www.cuc.ac.jp/)がプロ野球選手のポジション・身長・体重のデータを
提供していらっしゃったのでこのデータを使いたいと思います。
Pythonのコードを書く
上の方に書いたグラフのコードはこんな感じです。
# Excelを読み込んで散布図を書く
import openpyxl
# baseball.xlsxを読み込み
wb = openpyxl.load_workbook("baseball.xlsx")
# 名前が「Sheet1」のシート
ws = wb["Sheet1"]
#シートの列数
row_max=ws.max_row
#身長と体重と球団セルを探す
for row in ws.rows:
for cell in row:
if cell.value == '身長':
height=cell.column
elif cell.value == '体重':
weight=cell.column
elif cell.value == '球団':
team = cell.column
#身長・体重と所属球団のリストの箱
height_box = []
weight_box = []
team_box =[]
#身長・体重・所属球団をリストの箱に入れる
for i in range(2,row_max):
height_box.append(ws.cell(row=i, column=height).value)
weight_box.append(ws.cell(row=i, column=weight).value)
team_box.append(ws.cell(row=i, column=team).value)
##########ここから図を書くコード##########
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns
#x:横軸に身長、y:縦軸に体重、style:形、hue:色、
p=sns.scatterplot(x=height_box, y=weight_box, style=team_box, hue=team_box, palette='Paired')
sns.set_style("whitegrid", {'grid.linestyle': '--'})
#軸の名前
p.set_xlabel("身長", fontsize = 16)
p.set_ylabel("体重", fontsize = 16)
#なぜか下のコードをこのポジションに描かないと、日本語が表示できなかった
sns.set(font='IPAexGothic')
p.legend(loc = 2, bbox_to_anchor = (1,1))
plt.show()
plt.close()
今回のプログラミングのポイント
リストを作成して、必要な値を追加する
グラフを作るときにまず必要なものが、グラフに描画するデータのリストです。
今回のプログラミングで、該当するのがこのコード
for i in range(2,row_max):
height_box.append(ws.cell(row=i, column=height).value)
weight_box.append(ws.cell(row=i, column=weight).value)
team_box.append(ws.cell(row=i, column=team).value)
何をやっているかというと、下の図のようなイメージです。
球団・身長・体重のリストにfor文で1個ずつ値をいれてます。
次に、この3つのリストを使ってグラフを書きます。
それが下の箇所
#x:横軸に身長、y:縦軸に体重、style:形、hue:色、
p=sns.scatterplot(x=height_box, y=weight_box, style=team_box, hue=team_box, palette='Paired')
sns.set_style("whitegrid", {'grid.linestyle': '--'})
横軸の値を選手の身長のデータが入ったリスト、縦軸の値を体重のデータが入ったリスト、マークの色・形を選手の所属球団をしています。
seabornのscatterはもっと他にも、指定方法があるので
詳細を知りたい方は英語で難しいかもしれませんが、是非下記の公式HPの散布図に該当するページを確認してみてください。
上で書いたことを理解された方なら絶対大丈夫です!
日本語対応
matplotlib や seaborn ライブラリで日本語が含まれるグラフを作成する時に
何も指定をしないと、文字化けします(白目)
これはデフォルトで、日本語に対応していないフォント(sans-serif)を使用しているかららしいです。
そこでjapanize-matplotlibライブラリをインストールして、読み込みます。
pip install japanize-matplotlib
あとはコード中のように
sns.set(font=’IPAexGothic’)
のように利用フォントに IPAexGothic を設定すると大丈夫です。
終わりに
ここまで読んでいただいて本当にありがとうございます。
処理が早かったり、綺麗なコードを意識したことはほとんどなくて
for文のところとかも、実はもっとかっこよく書けるのかなって思ったりもしました。
for文とか使わずに、もっと簡単に書く方法はないの??
と思う人もいるのかと思うのですが、下のリンクのpandasだと
もっと楽にかけます。
さて今回の中身ですね!!
グラフにした時に気になったことなんですが
散布図で書くと、明らかに他の選手と体格が違う選手が浮き彫りになりますよね(笑)
左下の、私よりも身長も体重も小さい選手ってどんなのだろう?
左上の、身長の低い重量のある選手って誰だろう?など
次は何かカーソルをあてたら、どんな選手かわかるような
グラフにしたいと思いました。