今回は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()
グラフを描画すメソッドを使っているけど、これはこんな感じ。
横幅や縦幅、寄せなどを引数で指定できる。自分が作りたいグラフになるように色々指定してみるといいけど、指定できるもの多すぎてちょっと面倒。まあ最低限xとheightを指定してやればグラフは描画できるから楽っちゃ楽かな。
複数の棒グラフを作る
棒グラフを並べるように表示することもできる。例えば一回目と二回目のテスト結果をグラフで表すようなことをしてみると・・・
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()
これはグラフを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()
ちゃんと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")
なんか綺麗なのが出てきましたね。ただこれどこのデータ使っているんだろう?load_dataset()でデータを読み込んでいるようだけど見てみるとこれみたいですね。
上のグラフはtipsっていうデータセットを使ったけど、他にもいろんなデータセットがあって例えば適当に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")
さっきはサンプルのコードを読み込んで作ったけど、今回は適当にAgeとPointっていうものを指定して作った。データフレームをいちいち作るのが面倒だけど、まあいいでしょう。
自作のCSVデータから棒グラフを作成する
コードの中で数値を指定してグラフを作成してもいいけど、やりたいことが多そうなのってcsvデータなんかを棒グラフにするみたいなことですよね。用意されているデータセットを使ってはできたから自作したcsvファイルでもできるはず。ということでまずは適当にスプレッドシートで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")
今回はread_csvでさっきスプレッドシートから作ったcsvを読み込んでグラフにしてみた。スプレッドシートに適当に書いた値もグラフにしてみるとこうやっぱり見栄え良いですね。
Seabornで複数の棒グラフを作る
次はSeabornで複数の棒グラフを作ってみよう。grouped_barplotっていうやつがあるからそれを使う。ドキュメントにあるやつを改造して使ってみるけど、データがないのでまずはデータを作る。とりあえずスプレッドシートでこんな感じのデータを。
年齢と点数と性別を置いておいて、男と女の性別でグラフを複数にしたい。コードを実行してグラフを見てみるとまあ悪くないですね。
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としてダウンロードしたこのファイルを読み込むコードを書いてグラフを作ってみる。
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結構良いなーという印象を抱いた。
ただ今回はちょっとした触り程度ぐらいしかできていないから、正直まだ見えていない。最高の棒グラフを作りたい方はぜひ色々試して素敵な棒グラフ作成の探究をしてみてください。