【matplotlib/seaborn】Pythonでいろんな棒グラフを作成する方法

今回はPythonで棒グラフを作るっていうことをやっていきたい。特に何かデータをグラフにして今すぐ可視化したいとかっていう事情が発生したわけではないけど、グラフ化が必要な時もやってくるだろう。

Pythonではmatplotlibを使った方法やseabornを使った方法があったりするから、それぞれザッとどんな感じでできるのかをやっていきたい。今回はmatplotlibとseabornっていうやつを使うけど、軽く試した感じseaborn結構良いですね。

matplotlibとseabornをインストール

今回はmatplotlibとseabornを使ってやっていくからこの2つをインストール。

$ python -m pip install -U pip
$ python -m pip install -U matplotlib
$ pip installl seaborn

Anacondaを使っている場合は、condaコマンドを使ってインストールすることができる。公式サイトを読んでインストールするのが良いと思いますよ。

インストールしたら棒グラフの作成に移ろう。

matplotlibで棒グラフを作る

まずはシンプルなものを作って表示してみるとこんな感じになる。

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
 
plt.bar(x, y)
plt.show()

python-matplotlibで作成した棒グラフ

グラフを描画すメソッドを使っているけど、これはこんな感じ。

matplotlib-pyplot-bar

matplotlib-pyplot-bar

横幅や縦幅、寄せなどを引数で指定できる。自分が作りたいグラフになるように色々指定してみるといいけど、指定できるもの多すぎてちょっと面倒。まあ最低限xとheightを指定してやればグラフは描画できるから楽っちゃ楽かな。

matplotlib-pyplot-barのパラメーター

複数の棒グラフを作る

棒グラフを並べるように表示することもできる。例えば一回目と二回目のテスト結果をグラフで表すようなことをしてみると・・・

import numpy as np
import matplotlib.pyplot as plt

x1 = [1, 2, 3]
y1 = [50, 70, 80]

x2 = [1.2, 2.2, 3.2]
y2 = [80, 95, 90]

label_x = ['TEST1', 'TEST2', 'TEST3']

plt.bar(x1, y1, width=0.2, label='First')
plt.bar(x2, y2, width=0.2, label='Second')
plt.legend(loc=2)
plt.xticks([1.1, 2.1, 3.1], label_x)
plt.show()

 

matplotlibで作成した複数の棒グラフ

これはグラフを2つ作って位置を調整して表示しているんだけど、結構面倒ですね。グラフを作るのはそうでもないけど、位置の調整がしんどい・・・

積み上げ棒グラフを作る

積み上げる棒グラフは片方のグラフをどこから積み上げるのかっていう、bottomを指定してやればそんなようなグラフを作ることができる。試しにx軸にdays、y軸にmoney1,money2っていうのを指定してやってみると・・・

import matplotlib.pyplot as plt
days = [1, 2, 3, 4, 5, 6, 7]
money1 = [1000, 2000, 3000, 4000, 5000, 6000, 7000]
money2 =[5000, 4000, 3000, 2000, 3000, 5000, 10000]
 
plt.bar(days, money1, label='value1')
plt.bar(days, money2, bottom=money1)
plt.xlabel('Day')
plt.ylabel('Money')
 
plt.show()

matplotlibで作成した積み上げ棒グラフ

ちゃんとmoney1とmoney2が足された結果がグラフに反映されていますね。

seabornを使って棒グラフを作る

seabornのドキュメントを見つつやってみるとこんな感じになる。

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")
sns.barplot(x="day", y="total_bill", data=tips)
plt.savefig("/Users/U/Desktop/graph.png")

seabornを使った棒グラフ

なんか綺麗なのが出てきましたね。ただこれどこのデータ使っているんだろう?load_dataset()でデータを読み込んでいるようだけど見てみるとこれみたいですね。

github-seaborn-data

上のグラフはtipsっていうデータセットを使ったけど、他にもいろんなデータセットがあって例えば適当にpenguins.csvなんかを使ってみるとこんな感じのグラフを作れたりする。

penguins.csvを使った棒グラフ

csvから適当に情報を与えて見たから何を表しているのか全然わからないけど、データ与えるだけで良い感じの色で作ってくれるのはいいですね。データセットはGithubのseaborn-dataからみることができる。ただやりたいことって自分たちが持っているデータや数値をグラフにしてくれるようなことですよね。。。

自分で数値を指定して棒グラフを作成する

seabornを使ってコードの中で数値を指定して、それらをグラフにしてあげるとこんな感じ。やっぱり何も色を指定しなくても良い感じの色合いになってくれますね。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

sns.set_theme(style="whitegrid")
df = pd.DataFrame({"Age": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
                    "Point": [200, 100, 150, 120, 300, 330, 410, 550, 310, 150, 460]})
sns.barplot(x = 'Age', y = 'Point', data = df)
plt.savefig("/Users/U/Desktop/graph3.png")

seabornを使って棒グラフを自作

さっきはサンプルのコードを読み込んで作ったけど、今回は適当にAgeとPointっていうものを指定して作った。データフレームをいちいち作るのが面倒だけど、まあいいでしょう。

自作のCSVデータから棒グラフを作成する

コードの中で数値を指定してグラフを作成してもいいけど、やりたいことが多そうなのってcsvデータなんかを棒グラフにするみたいなことですよね。用意されているデータセットを使ってはできたから自作したcsvファイルでもできるはず。ということでまずは適当にスプレッドシートでcsvファイルを作成する。

AgeとPointをスプレッドシートに記載 csvとして棒グラフデータを書き出す

単純なものだけど、これでcsvが作れたからそれを読み込んでグラフ化してみよう。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

sns.set_theme(style="whitegrid")
df = pd.read_csv("/Users/U/Downloads/graph-sheet.csv")
sns.barplot(x = 'Age', y = 'Point', data = df)
plt.savefig("/Users/U/Desktop/graph4.png")

自作のCSVデータから棒グラフを作成

今回はread_csvでさっきスプレッドシートから作ったcsvを読み込んでグラフにしてみた。スプレッドシートに適当に書いた値もグラフにしてみるとこうやっぱり見栄え良いですね。

Seabornで複数の棒グラフを作る

次はSeabornで複数の棒グラフを作ってみよう。grouped_barplotっていうやつがあるからそれを使う。ドキュメントにあるやつを改造して使ってみるけど、データがないのでまずはデータを作る。とりあえずスプレッドシートでこんな感じのデータを。

年齢と点数と性別を置いておいて、男と女の性別でグラフを複数にしたい。コードを実行してグラフを見てみるとまあ悪くないですね。

性別情報をcsvに取り入れる

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

sns.set_theme(style="whitegrid")
df = pd.read_csv("/Users/U/Downloads/graph-sheet4.csv")
sns.catplot(
    data=df, kind="bar",
    x="Age", y="Point", hue="Sex"
)
plt.savefig("/Users/U/Desktop/graph6.png")

性別情報を入れて作成した棒グラフ

それぞれの年齢の男と女の平均点が表示されている様子。データを使わずにコードで値を指定してもやってみる。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

sns.set_theme(style="whitegrid")
df = pd.DataFrame({"Age": [20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23],
                    "Point": [200, 100, 150, 120, 300, 330, 410, 550, 310, 150, 460],
                    "Sex": ['male', 'female', 'female', 'male', 'female', 'male', 'male', 'male', 'female', 'female', 'male'],
                    })
sns.catplot(
    data=df, kind="bar",
    x="Age", y="Point", hue="Sex"
)
plt.savefig("/Users/U/Desktop/graph7.png")

それぞれの年齢の男と女の平均点を表示したグラフ

22歳が男しかいないからmaleのものしか表示されていないね。データを使わずともコード上でデータセットを作ることで棒グラフ描画できた。

積み上げ棒グラフを作る

次は積み上げ棒グラフを作ろう。ダンダンってなってる棒グラフ。今回は例として、国語と数学の1週間のテスト結果を棒グラフで出すみたいな感じのことをやってみる。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

Japanese=[10,13,30,40,55,60,80]
Mathmatics = [11,20,8,40,35,59,72]
df = pd.DataFrame({"Japanese": Japanese,
                    "Mathmatics" : Mathmatics,
                    "Day": [1,2,3,4,5,6,7]})

sns.barplot(x = 'Day', y = 'Japanese', data = df, color='red')
sns.barplot(x = 'Day', y = 'Mathmatics', data = df, color='blue', bottom=Japanese).set( xlabel = "Day", ylabel = "Point")
plt.savefig("/Users/U/Desktop/graph8.png")

積み上げ棒グラフ

赤い部分が日本語のテスト、青い部分が数学のテストっていう感じ。棒グラフの色はそれぞれ引数のcolorで指定している。ポイントははbottomを使って、どの地点からグラフを積み上げるのかっていうのを指定しているところ。指定しないとグラフが重なって表示されてしまう。

CSVパターンもやっておこう。こんな適当なものを用意する。

積み上げ棒グラフのためにCSVデータを作成する

そしたらcsvとしてダウンロードしたこのファイルを読み込むコードを書いてグラフを作ってみる。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

Japanese=[10,13,30,40,55,60,80]
Mathmatics = [11,20,8,40,35,59,72]
df = pd.read_csv("/Users/U/Downloads/result.csv")
sns.barplot(x = 'Day', y = 'Japanese', data = df, color='red')
sns.barplot(x = 'Day', y = 'Mathmatics', data = df, color='blue', bottom=df.Japanese).set( xlabel = "Day", ylabel = "Point")
plt.savefig("/Users/U/Desktop/graph.png")

積み上げ棒グラフを作成

まあそりゃあデータセットの形があっていれば作れるのは当たり前ですよね。bottomは読み込んだデータセットからJapaneseっていう項目を使いたかったから、bottom=Japaneseとしている。

まとめ

今回matplotlibとseabornを使って棒グラフを作成してみたんだけど、結構いろんな棒グラフ作ることができますね。正直どちらも棒グラフは作れるから好きな方でいいと思うけど、個人的にデータをこうやって可視化する際にはseaborn結構良いなーという印象を抱いた。

ただ今回はちょっとした触り程度ぐらいしかできていないから、正直まだ見えていない。最高の棒グラフを作りたい方はぜひ色々試して素敵な棒グラフ作成の探究をしてみてください。