LoginSignup
1
1

More than 3 years have passed since last update.

Pythonグラフ描画ライブラリ matplotlib を触る

Posted at

matplotlib

前回の記事で少し触ったけど、もう少し色々深めてみる
公式サイト: https://matplotlib.org/

Jupyter Notebookで使う

matplotlib は JupyterNotebook 上でも使うことができ、インラインで表示ができる
インラインにこだわる必要はないが、別にする意味もないので
今回もJupyterNotebook上で試そうと思う 環境面で楽だし!

掘っていく

基本 おさらい(サンプルコードのみ)

image.png
そうだったそうだった
※ 使えるグラフのスタイルは plt.style.available で確認が可能!(複数指定も可 詳細はwebで!)

記述方法

MATLABスタイル

  • 上記のように plt.plot() のように matplotlib.pyplotモジュール を使って記述していく方法

オブジェクト指向スタイル

  • 描画オブジェクトとサブプロットを用いて記述していく方法で、MATLABスタイルよりは複雑
  • メリット
    • 1つの描画オブジェクト(fig)に対して、複数のサブプロットを持つことができる
    • そのため、複数のグラフを組み合わせての描画が可能

描画オブジェクトとサブプロット

関係

  • fig, ax = plt.subplots()

    • image.png
    • 1つの描画オブジェクト(fig)に対し、1つのサブプロットを作成している
    • 1つのサブプロットに対し、2回plotしているため同じグラフに2本描画される
  • fig, axes = plt.subplots(2)

    • image.png
    • 1つのfigに対して、2つのサブプロットを作成
    • axes[0] axes[1] という別々のサブプロットを使って描画している
  • fug, axes = plt.subplots(1, 2)

    • image.png
    • plt.subplots(n, m) でn行m列のサブプロットを作成できる
    • 例の場合、1行x2列のサブプロットが作成され、それぞれに描画をしている

サブプロットのタイトル

簡単! axes[0].set_title('タイトル!') って感じで書くとつけられる

凡例の表示

こんなんもできるんや・・・さすがグラフ描画専門

記述方法
  • 方法1

    • 各グラフ描画時にlabelを指定する
    • legendで表示 image.png
  • 方法2

    • legend で表示時にlabelを指定する image.png

サブプロットも1種のオブジェクトとして捉えると、方法1の方が個人的にはわかりやすいし変更しやすいかもー!
でもCSVから読んだヘッダーとかを凡例として使うなら、方法2の方が楽チンやな〜 実装次第で臨機応変にですな。

位置

凡例の位置も当然変更できて、locオプションで指定ができる
ax.legend(loc='lower right') とかやれば右下に表示される
センスに自信がない人は ax.legend(loc='best') で丸投げできるw 1番いいやつを頼む

軸の名前

  • ax.set_xlabel('X Label')
  • ax.set_ylabel('Y Label') うん、そのまんまですな
  • オプションもつけられる ax.set_xlabel('X Label', style='italic', size=10)

軸の項目名

これがなくては折れ線グラフとして機能しないよね〜
image.png
実は ax.plot(['2, 1, 3']) とか書いてたやつは、 ax.plot([0, 1, 2], ['2, 1, 3']) の略だったんだって!
第1引数:[0, 1, 2]がx座標、第2引数:['2, 1, 3']がy座標を表している
項目名は、ax.set_xticksで項目名を設定する位置を指定して、ax.set_xticklabelsで名称を設定する(y軸も同様)
テキスト挿入
ax.text(1,6, 2.9, 'Peak', size=12) って感じで好きな位置にテキストの挿入ができる

おまけ

グラフのスタイルは色から値のポイントマークの形、線のスタイルまで個別に指定できる
ax.plot([2, 1, 3], color='r', marker='s', linestyle='--', linewidth='3')
または省略して
ax.plot([2, 1, 3], 'rs--', linewidth='3')
でもいける。この略し方クールやなぁ

オプション名 意味 使い方
color 線、ポイントの色 r: 赤 b: 青 k: 黒 など
marker ポイントの形 .: ドット s: 四角 *: 星 など 
linestyle 線の種類 -: 実線 --: 点線 -.: 一点鎖線 :: ドット 空文字: なし など
linewidth 線の太さ 3 など

すでに盛りだくさん感があるが・・・

棒グラフ

折れ線グラフはplotで値を置いていったけど、barで置いていくことで棒グラフで描画できる
image.png
image.png
x2が若干ややこしいけど、隣に描画するために棒の幅分プラスしてあげてるんやな、なるほど
隣に描画できるなら上に積み重ねることもできて、その場合はx1は固定で
ax.bar(x1, y2, bottom=y1, width=width, ~~~~)
というふうにボトム(つまり0とする位置)を指定してあげると縦に積み重なる

円グラフ

pieで描画する あのパイ生地のパイに例えてるの? オシャレすぎる・・・
image.png
やっやこしっ! オプション名でだいたいわかるけど、これだけ覚えてれば良さそうね

オプション名 意味 使い方
explode 中心から
どれぐらい離すか
[0, 0.1, 0](割合)
半径x0.1離れる など
labels 項目名 そのまんま
autopct パーセンテージ表示方 %.1f%%: 小数点以下1桁と「%」
関数等も指定できるので必要に応じて調べる
startangle 開始角度 90(時計で言うと12時が90度、3時が0度)
counterclock 反時計回りか True/False 反時計にしたい時ってあるのか?w

ax.axis('equal')はグラフのアスペクト比調整の呪文らしいので書いておくと幸せ

散布図

scatterで描画していく
image.png
特に変わったところはないな
オプションのsは点の大きさを指定している

ヒストグラム

histで描画していく
image.png
データがこれとしたら
image.png
binsはヒストグラムのビン(階級)を表してて、1階級にどれだけデータを含むかの値なんだってさ
stacked=Trueを指定すると、例で言うと男女のグラフが積み重なったヒストグラムになる

箱ひげ図

ん?なにそれ?

応用

2種のグラフを重ねて表示する

某サイトを参考にテストデータを拝借、計算方法等は今はどうでもいいのでそのまま使う
image.png
image.png
新しく出てきたメソッドとかにコメント入れてみましたが、
twinxサブプロットさえ作ってしまえば、あとは今まで通りな感じですね!!!

感想

グラフだけで色々できすぎ〜 プログラムだけでここまでグラフが描けるということには驚いてる(Excelのグラフも使えこなせないのは内緒)
他にもグリッドや文字の色とか文字(タイトル、ラベル含め全般)のフォントを変えられたり、ワードクラウドみたいなのも作れるみたい
これから触るけど、Pandasとかで分析してこれらのグラフでバッと出したりするんだろうなぁ〜多分
かっこええやん、それ

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1