plt.figure とplt.subplot

# coding: utf-8
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
import japanize_matplotlib # matplotlibで日本語の文字化けが起きないようにする。

exam_score_df = pd.read_csv("exam_score.csv", encoding="shift-jis") # csvファイル内の日本語を読み込むためencoding="shift-jis"をつける

exam_score_df.head()
国語社会数学理科
030435163
139214956
229302357
3958777100
470717867

matplotlibでは複数の図を同時にプロットさせるためには、figureaxesという概念を知っておく必要がある。

figureは図が貼り付けられる背景で、

axesとはfigureに貼り付けられる図であると考えると理解しやすい。

# 1つのfigureを作る
plt.figure(figsize=(10,4))

plt.subplot(1,2,1) これはplt.subplotで後で出てくるplt.subplotsとは違う
plt.hist(exam_score_df['国語'], bins=30)
plt.title('国語点数')
plt.xlabel('点数') # このラベルは国語の点数に付けられる。
plt.ylabel('人数')

plt.subplot(1,2,2)
plt.hist(exam_score_df['数学'], bins=30)
plt.title('数学点数')
plt.xlabel('score') # このラベルは数学の点数に付けられる。
plt.ylabel('number')

plt.show()
  • plt.figure()でfigureを作る。
    • 引数のfigsize=(a,b)でfigureの大きさを指定できる。
    • figsize=(10,4)だと横10インチ、縦4インチのfigureを作ったことになる。(1インチ=2.54cm)
  • plt.subplot()でaxesが作る。plt.subplot()の引数によってそのaxesの配置が決められる。
  • plt.subplot()の引数は次のようになる。plt.subplot(行数, 列数, 左上から右に数えた順番)
    • 行数と列数はaxesが何行何列存在するかのことを表す。例題の場合、1行2列なので(1,2, - )のようになっている。
    • 3番目の引数左上から右に数えた順番とは左上のものを1つ目とし、数えた順番で例えば3×3に表示したい場合は1 2 3 4 5 6 7 8 9のような順番となる。なので例題ではplt.subplot(1,2,1)plt.subplot(1,2,2)のように2つをプロットしている。
  • plt.subplot()で作られたaxesは次のaxesを作る前に図のプロットやカスタマイズをしておくべき。

まとめ

  • plt.figure()でfigureを作り、figsize=(a,b)でfigureの大きさを指定できる。
  • plt.subplot()でaxesを作り、plt.subplot(行数, 列数, 左上から右に数えた順番)のように引数をとり図の配置場所を指定できる。

注意

  • plt.subplot()でaxesを作ってから次のaxesをまた作ってしまうと前のaxesは編集できない

subplots()とは

plt.subplots()は2つの返り値を持っている関数で、figureとaxesを返してくれる。

そのaxesを編集することでfigure内にプロットする図をそれぞれ編集できる。

fig, axes = plt.subplots(1, 2, figsize=(11, 4))
axes[0].scatter(exam_score_df['国語'], exam_score_df['社会'])
axes[0].set_title('国語と社会')
axes[0].set_xlabel('国語')
axes[0].set_ylabel('社会')

axes[1].scatter(exam_score_df['数学'], exam_score_df['理科'])
axes[1].set_title('数学と理科')
axes[1].set_xlabel('数学')
axes[1].set_ylabel('理科')

plt.show()
  • plt.subplots()はfigure, axesの2つを返り値とする
  • 引数としてfigsize=()を追加し、figureのサイズを変更できる。(ない場合デフォルトの値となる)
  • plt.subplots()の必須の引数としてはplt.subplots(行数、列数)の形で、figure内に入るaxesが何行何列あるかの情報が入る。
    • その行数と列数によってaxesの形が異なってくる。
    • axesが行数1、列数1の場合、1つのaxesしかないので返り値のaxesをそのまま編集する。
    • axesがNx1や1xMの行列の場合、axesは1次元の配列として返される。axes[0]で1枚目、axes[1]で2枚目のaxesだと思ってを編集できる。
    • axesが行数、列数がどっちも1以上の場合、axesは2次元の配列として返される。axes[0, 0]で1枚目、axes[0, 1]で2枚目 … のaxesだと思ってを編集できる
  • axesの編集時には今までのpltの代わりに編集するaxesを使うイメージでメソッドを付ける。
    • 例えばaxes[0]に散布図をプロットすることはaxes[0].scatter()のようにする。
    • タイトルや軸名はpltでのメソッド名と少し違っていて、set_titleset_xlabelset_ylabelのように前に‘set_’が付く
    • ただしlegendで凡例を付ける場合は普通にaxes.legend()とする。

コメント

タイトルとURLをコピーしました