「プログラミングでデータを可視化したい」
「棒グラフをプログラムで描画したい」
そんなことを考えたことはありませんか?
この記事ではPythonを使って、データを棒グラフで描画する方法について解説します。
【基礎】簡単な棒グラフの描画方法
【基礎】色や太さなどの細かい調整方法
【発展】2Dだけでなく3Dで棒グラフを描画する方法
といった基礎から実践まで役立つ発展的な内容も解説します。
※ この記事のコードはPython 3.7で動作確認しました。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
pythonで棒グラフを描画してみよう
Excel等のソフトを使えば簡単に棒グラフを作成できます。
しかしあるデータに対して棒グラフを作成しようと考えたとき、わざわざ表計算ソフトにデータを移してグラフを作成するよりも、プログラムから直接作成できた方が便利です。
Pythonを使ったグラフの作成も、便利なライブラリを使うことで簡単に行うことができます。
そこでPythonでグラフを描画するときによく使われるmatplotlibというライブラリを使ってみましょう。
matplotlibとは?
matplotlibを使うことで、簡単にデータをグラフにプロットできるようになります。
もしお使いのPCにmatplotlibがインストールされていなければ、まずはターミナル上で次のコマンドを打ちましょう。
(※Pythonプログラム中でimport matplotlibと書いたときにModuleNotFoundErrorが出れば、インストールされていない可能性が高いです)
pip install matplotlib
最近はPythonを直接入れずにAnacondaというデータ分析に関するライブラリを含んだ開発環境を丸ごとインストールすることが多くなっています。
Anacondaをインストールしていればmatplotlibも同時にインストールされているため、わざわざmatplotlibをインストールする必要はありません。
matplotlibを使うには、プログラムにインポートする記述が必要です。
早速matplotlibをインポートしてみましょう!
import matplotlib.pyplot as plt
これはmatplotlib.pyplotモジュールをpltという名前でインポートしています。
インポートはプログラムの最初に書けば良いため、何度も同じコードを書く必要はありません。
ですが、以降のサンプルコードは別のプログラム(モジュール)であることを想定しているため、毎回importを行っていることに注意してください。
簡単な棒グラフ
それでは早速、棒グラフを描画してみましょう!
import matplotlib.pyplot as plt left = [1, 2, 3] # グラフの横軸(X軸) height = [3, 5, 0] # 値(Y軸) plt.bar(left, height) plt.show()
このコードでは変数leftに横座標、変数heightに縦座標を入れ、plt.bar()の引数としています。棒グラフの見た目を変更するには、同じようにbar関数の引数を指定します。
試しに、同じデータで棒グラフを赤色にしてみましょう。
import matplotlib.pyplot as plt left = [1, 2, 3] # グラフの横軸(X軸) height = [3, 5, 0] # 値(Y軸) plt.bar(left, height, color='r') plt.show()
bar関数の引数としてcolorをr(red)にしました。
他にも
widthで棒の幅
edgecolorで枠線の色
linewidthで枠線の太さ
tick_labelで横軸のラベル
などが指定できます!
では実際にコードを書いてみましょう。
import matplotlib.pyplot as plt left = [1, 2, 3, 4, 5] height = [80, 65, 100, 42, 54] # 点数 labels = ['Japanese', 'Math', 'Science', 'Social', 'English'] plt.bar(left, height, width=0.5, color='#0096c8', edgecolor='b', linewidth=2, tick_label=labels) plt.show()
このサンプルは5教科の点数を棒グラフで表示しています。labelsという変数に5教科の名称を入れています。
また、先ほどとは違いcolorにrやbなどではなく、カラーコードを直接指定していますね。カラーコードを直接指定すれば細かい色の調節も可能になります。
ここではplt.bar()の引数にalignを指定していません。もし同じようなグラフにならず、棒グラフが左に寄っていたりする場合にはalign=’center’を引数に追加してください。
色んな形で描画してみよう
ここまで棒グラフの色や太さの指定方法について説明してきました。
次はデータを複数使って描画する方法を見ていきましょう!
複数の棒グラフを横に並べる
先程と同じように、5教科の点数を棒グラフで描画したいとしましょう。
このとき、他の人と点数を比べたいと思ったら、横にグラフが2つ並んでいた方が便利ですよね?
それでは早速、2つのデータから棒グラフを作成してみましょう!
新しいプログラムがいくつか出てきますが、プログラムを提示した後に解説しますので、読み進めてみてください。
import matplotlib.pyplot as plt import numpy as np height1 = [80, 65, 100, 42, 54] # 点数1 height2 = [55, 100, 98, 30, 21] # 点数2 left = np.arange(len(height1)) # numpyで横軸を設定 labels = ['Japanese', 'Math', 'Science', 'Social', 'English'] width = 0.3 plt.bar(left, height1, color='r', width=width, align='center') plt.bar(left+width, height2, color='b', width=width, align='center') plt.xticks(left + width/2, labels) plt.show()
2人の点数が横に並んでいますね!
まず、matplotlibの他に、numpyというライブラリをインポートしています。numpyは計算でよく使われるライブラリですが、今回は横軸を簡単に設定するために利用します。
データが2つあるため、本来であればheight、leftをともに2つ用意しなければなりません。
しかしこのサンプルコードではheightを2つ用意し、leftは1つだけしか用意していません。
複数のグラフを並べる場合、横軸leftを毎回棒の幅分だけずらさなければなりません。それは面倒ですよね。しかもデータが増えるほどその作業が増えるために効率が悪いです。
そこでnp.arange()を使ってheight1の要素の数だけ連番を作成しています。
また、plt.xticks()を使ってleftを棒グラフの幅の1/2だけ足すことによって、ラベルの位置を2つの棒グラフの中心になるように設定しています。
横向きに棒グラフを表示する
次は横向きに棒グラフを描画してみましょう。
import matplotlib.pyplot as plt import numpy as np height1 = [80, 65, 100, 42, 54] # 点数1 height2 = [55, 100, 98, 30, 21] # 点数2 left = np.arange(len(height1)) # numpyで横軸を設定 labels = ['Japanese', 'Math', 'Science', 'Social', 'English'] height = 0.3 plt.barh(left, height1, color='r', height=height, align='center') plt.barh(left+height, height2, color='b', height=height, align='center') plt.yticks(left + height/2, labels) plt.show()
先程のコードとほぼ同じです。違うのはplt.bar()ではなくplt.barh()を使っているということです。これによって横向きのグラフになります。
また、widthがheightになりました。棒の幅が横ではなく縦になったのでheightにする必要があります。
3Dで棒グラフを描画してみよう
今までX,Y軸のみでグラフを表示してきました。
最後にZ軸を増やしてグラフを表示してみましょう。
from mpl_toolkits.mplot3d import Axes3D import numpy as np left = [1, 2, 3, 4, 5] height = [2, 4, 8, 16, 32] fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.bar(left, height, zs=0, zdir='y') ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show()
3Dで描画するためにAxes3Dをインポートしています。Axes3Dを使うために最初にfigとaxを宣言しています。
棒グラフは今までと同様にbar()で描画できます。ただしax.bar()ですね。
引数にはzdirが追加されています。これはプロットする方向を指定しています。ここでyを指定しない場合には、y軸の方向に向かってプロットされるため、奥に向かってプロットされてしまいます。そこでこの例ではy軸ではなくz軸にプロットするように指定しています。
もっと複雑な3D棒グラフはチュートリアルがあるため、参照してみてください。
まとめ
今回は、pythonのmatplotlibライブラリを使って棒グラフを描画する方法を紹介しました。
プログラミングでグラフが描画できれば、データの可視化に役立ちます。
ぜひマスターして複雑なデータを視覚的に表現できるようになりましょう!