本サイトは広告・プロモーションが含まれています
Python

【Python】Excelデータから散布図を書く【seaborn・openpyxl】

この記事は、こんな人にオススメ

・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だと
もっと楽にかけます。

さて今回の中身ですね!!
グラフにした時に気になったことなんですが

散布図で書くと、明らかに他の選手と体格が違う選手が浮き彫りになりますよね(笑)
左下の、私よりも身長も体重も小さい選手ってどんなのだろう?
左上の、身長の低い重量のある選手って誰だろう?など

次は何かカーソルをあてたら、どんな選手かわかるような
グラフにしたいと思いました。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA