今回解説するのは、Pythonのライブラリとしても有名なmatplotlibです!
matplotlibはNumPyのグラフ描画を行うためのライブラリで、データサイエンティストの方であれば、普段からバリバリ使っているものと思います。
以前、データサイエンティストとして活躍している友人から「データの集計や科学計算ができても、その結果をグラフ化しないとなかなか伝わらないんだよ」なんて言葉を聞いた事があります。
Pythonでは様々な(小難しい)数字を扱ってデータの解析を行いますが、その結果は一般の人にはなかなか伝わらないんですね。しかしmatplotlibを使ってグラフの描画をすれば、結構伝わる(様な気がする)ものです。
今回はそんなmatplotlibについてご紹介していきたいと思います。いくつかのグラフの描画をしてみれば、すぐに使いこなせるはずです。
コンテンツ
matplotlibとは?
改めてmatplotlibについて簡単に説明しておくと、
・Pyhonのライブラリ「NumPy」のグラフ描画を行うライブラリ。数学的なグラフを描画するのがとっても得意!
・アプリケーションの中にグラフ描画機能などをもたせる事が可能、また、画像として出力も可能。
・PythonのVer2.6以上 or Pyhon3なら使用可能
・代表的なモジュールとして「pyplot」などが有名。
といった事が挙げられます。
ライブラリのインポート
matplotlibはモジュールを指定してインポートするのが一般的です。例えばpyplotをインポートする場合を例にあげます!
■Pythonコード
1 |
import matplotlib.pyplot as plt |
この他にも使用するモジュールに応じてインポート文を書いてあげて下さい。
matplotlibを使ったグラフ描画
せっかくのグラフ描画ですから、実際の絵を見たいと思いますので、さっそく実例をあげながら使ってみましょう。
■実行の前提
・matplotlibをインストール済み
・Jupyterで実行
とりあえず1次関数の描画
まずは1次関数を描画しましょう!
※1次関数は(簡単に言うと)見た目は棒線です。特にイメージするのは、斜め上に上がっていく棒線ではないでしょうか。
以下の様なコードを実行してみましょう。
■Pythonコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import numpy as np import matplotlib.pyplot as plt print('NumPy配列生成') x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) print(x) y = 5 * x # plot実行時の引数(横軸の変数(x)、縦軸の変数(y)) plt.plot(x, y) # 描画する print('\nグラフ描画') plt.show() |
■実行結果
■簡単な解説
簡単に処理の流れをまとめておきます。
1)ライブラリのインポート ※冒頭のimport~
2)NumPyの配列を作成(中身をprintしています)
3)計算式を作成 Y = x * 5
4)pyplotでplotする(とりあえず必要な値を引数として渡すと覚えておきましょう)
5)描画する
結構簡単だったと思います。ちなみにNumPyでなく、普通の配列を使用するとエラーになります。やはりmatplotlibはNumPyとセットで使う必要があるんですね。
2次関数
次に2次関数も表示してみましょう。
※ちなみにNumPyのarangeという関数も同時にここで使ってみます。単純な等差数列ですので、コードを見れば使い方は分かると思います!
■Pythonコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import numpy as np import matplotlib.pyplot as plt #等差数列 np.arange(開始,終了,加算値) x = np.arange(-50, 50, 1) y = x**2 + x*2 + 5 # plot実行時の引数(横軸の変数(x)、縦軸の変数(y)) plt.plot(x, y) # 描画する print('\n2次関数グラフ描画') plt.show() |
■実行結果
■簡単な解説
こちらも簡単に処理の流れをまとめておきます。
1)ライブラリのインポート
2)NumPyのarange関数で等差数列を生成
3)2次関数の計算式を作成 y = x**2 + x*2 + 5
4)pyplotでplotする
5)描画する
高校数学で何度も出てきた2次関数が描画できました!これでいちいち自分で2次関数を書く必要はありません(笑)
sin波の描画
さて、高校で学んだsin波も描画してみましょう。当時は訳の分からない公式に悩まされましたが、グラフで描画すると、なかなか美しい形をしています。コードの内容はこれまでと足して変わりませんので、細かい解説まではしません。
■Pythonコード
1 2 3 4 5 6 7 8 9 10 |
import numpy as np import matplotlib.pyplot as plt x = np.arange(-5, 5, 0.1) y = np.sin(x) # 描画する print('\n sinグラフ描画') plt.plot(x, y) plt.show() |
■実行結果
cos波描画
ついでにcos波も書いてみようと思いますが、こちらは細かいコードを説明するまでもありませんね。cos用に以下のコードに書き換えてあげればOKです。
■Pythonコード(一部のみ)
1 |
y = np.cos(x) |
■実行結果
分布図
さて、これまでに解説した内容は高校数学までを勉強すれば自分でも書ける様なグラフです。この辺りからmatplotlibが本領を発揮してきますよ!
手書きではなかなか難しいグラフをバンバン描画してくれるのです。しかも一瞬で!プログラミングってやっぱ凄いかもと実感できます。
ここでは以下の様な値をグラフにしてみましょう。
・x は 1~50までの数字
・y は 乱数
こんなデータの場合は棒グラフにする意味がありません。こんな時は分布図を表示してみましょう。アンケート結果などでよく使われます。
分布図を使う方法は簡単で、plotする時に3つ目の引数に「”o”」を設定してあげるだけです。plot関数は3つ目の引数で様々なグラフ描画の設定ができる様ですね。
■Pythonコード
1 2 3 4 5 6 7 8 9 10 |
import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 50, 1) y = np.random.randn(50) # 描画する print("\n 分布図") plt.plot(x, y, "o") plt.show() |
■実行結果
■コードの解説
以下の順番で処理をしています。
1)ライブラリのインポート
2)横軸の値を50個生成
3)NumPyのrandn関数で乱数を生成(randn関数で標準正規分布を50個生成しています。ちなみにrandn関数の2つ目の引数を設定すると標準偏差の値を変更できます。※標準正規分では平均は0、標準偏差は1になります)
4)pyplotでplotする(3つ目の引数を”o”として分布図としてplot)
5)描画する
データサイエンティストがやりそうなグラフ描画がちょっとだけできたのではないでしょうか。(実際にデータサイエンティストの友人に言わせれば、まだまだだそうですが。。。)
ちなみに、plotは2回呼び出す事ができます。
たとえば、plot以降の処理を以下の様なコードに変更すると、
■Pythonコード(一部分)
1 2 3 4 5 |
# 描画する print("\n 分布図&グラフ") plt.plot(x, y, "o") plt.plot(x, y) plt.show() |
■実行結果
こんな感じで描画をする事も可能です。なんだかちょっと使いこなしている感が出てきませんか?これを手で作成しようと思ったら、50個の乱数を用意して、それを一個一個図に書きいれて・・・と大変な作業です。
コンピュータは本当に数学計算、グラフ描画が大得意です。
matplotlibで描画するグラフの設定変更
上記で実行したコードではグラフの種類を変更しましたが、他にも色を変えたり様々な事ができるので、そんな時は仕様書もご参考になさってくd。私の様に英語が苦手だとちょっと大変かもですが。。。
やれる事はたくさんあるので、どんなグラフを描画したいかを考えながら適宜必要な設定変更を行ってみましょう。
という事で、グラフの設定も少し試してみます。
グラフの設定
これまでに作成したコードを基にして、グラフの設定もいじってみましょう。
分布図を作成した時のコードをいじりながら、以下も設定してみました。
・グラフのタイトルを付ける(これまでprintしていましたがタイトルを付けられます)
・グラフの縦軸の範囲を指定
・分布グラフの値を赤丸に変更
■Pythonコード
1 2 3 4 5 6 7 8 9 10 11 12 |
import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 50, 1) y = np.random.randint(0,100,50)*20 # 描画する plt.plot(x, y, "ro") plt.plot(x, y) plt.title("map & chart") plt.ylim(0, 2000) plt.show() |
■実行結果
■コードの解説
以下の順番で処理をしています。
1)定番のインポート
2)値の設定 ※ちなみにrandint関数では(最小値、最大値+1、要素数)を引数として設定可能です。
3)プロット(3つ目の引数を”ro”とする事で赤い玉の分布図を描画します。redのrらしいです。)
4)タイトルはtitle関数で、y軸の範囲はylim関数で指定可能です。
5)描画
これで、タイトルを付与したり、軸幅などの固定化もできました。エクセルなどでできる設定は大抵できますので、グラフを少し見やすくしたいという場合には使ってみて下さい。
まとめ
さて、今回はmatplotlib(の中のpyplotモジュール)について解説しました。
実際に使ってみると非常に簡単だったと思います。この簡単に使える辺りがmatplotlibの人気の秘密です。そして、これらのライブラリを容易に扱う事ができるのがPythonという言語の人気の秘密でもあると思います。
今回ご紹介したグラフの描画というのは、かなり役に立つと思いますので、値などを変えながらぜひ活用してみて下さい。