# 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()
国語 | 社会 | 数学 | 理科 | |
---|---|---|---|---|
0 | 30 | 43 | 51 | 63 |
1 | 39 | 21 | 49 | 56 |
2 | 29 | 30 | 23 | 57 |
3 | 95 | 87 | 77 | 100 |
4 | 70 | 71 | 78 | 67 |
matplotlibでは複数の図を同時にプロットさせるためには、figureとaxesという概念を知っておく必要がある。
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つをプロットしている。
- 行数と列数はaxesが何行何列存在するかのことを表す。例題の場合、1行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_title
、set_xlabel
、set_ylabel
のように前に‘set_’が付く。 - ただし
legend
で凡例を付ける場合は普通にaxes.legend()
とする。
- 例えば
コメント