6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ゼロからはじめるmatplotlib〜3.複数グラフの表示〜

Last updated at Posted at 2019-08-25

準備

ハリーになりきって、「ルーモス、光よ」と唱える。

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

複数のグラフの表示

今回は複数のグラフを一度に一つの画像に表示する方法について書きます。

複数グラフを書く時には、plt.subplot()というメソッドを使うことで実現できます。
ざっくり表現するならplt.subplot()は__グラフ用紙を準備するメソッド__です。

例えば、Jupyter上で以下を実行すると枠だけが表示された2つのグラフが出力されます。

plt.subplot(2,1,1)
plt.subplot(2,1,2);

<出力結果>
subplot.png

何も書かれておらず、ただの枠しかないので実質グラフ用紙が2つ並べられた状態ですね(笑)。

plt.subplotの引数内の数字の意味は

plt.subplot(何行用意するか,何列用意するか,何番目のグラフか)

という意味です。

したがってグラフ用紙を2行3列に並べたものを用意したいときは、次のように書くと

plt.subplot(2,3,1) #左上
plt.subplot(2,3,2) #中上
plt.subplot(2,3,3) #右上
plt.subplot(2,3,4) #左下
plt.subplot(2,3,5) #中下
plt.subplot(2,3,6); #右下

subplot2.png

2×3のグラフ用紙が用意されます。
また全てのグラフ用紙には左上から右下へ、1,2,3...と順番が決められているのでそれを指定することでどのグラフ用紙に描画するかを決めています。

グラフ用紙にグラフを書いていく

1×2に並べたグラフ用紙にsinx,cosxのグラフを書く

# x軸となる0から2πまでの数字を0.01刻みで生成
x = np.arange(0,2*np.pi,0.01)

# 1個目のグラフ(左)
plt.subplot(1,2,1)
plt.plot(x, np.sin(x))

# 2個目のグラフ(右)
plt.subplot(1,2,2)
plt.plot(x, np.cos(x));

<出力結果>
subplot3.png

全体の画像のバランスはplt.tight_layout()を追加して簡単に整えることができます。
plt.figure(figsize=(?,?))でサイズを変えてもOKです。(下はサイズを変化させて整えています。)

x = np.arange(0,2*np.pi,0.01)

# 画面全体の調節
plt.figure(figsize=(8,4))

# 1個目のグラフ
plt.subplot(1,2,1)
plt.plot(x, np.sin(x))

# 2個目のグラフ
plt.subplot(1,2,2)
plt.plot(x, np.cos(x));

<出力結果>
subplot4.png

もっと詳細にグラフの間を調節したいときは、plt.subplots_adjust()を使います。
参考サイト:matplotlib subplot。グラフ間の間隔を調整-python

ここまでの知識を使って描画してみる。

2×3に並べたグラフ用紙の一つ一つに、三角関数や媒介変数で表現される曲線を描画していく。
参考サイト:https://mathtrain.jp/sevencurve


theta = np.arange(0,2*np.pi,0.01)

# 全体のサイズ調節
plt.figure(figsize=(12,9))

# 右上
plt.subplot(2, 3, 1)
plt.plot(theta, np.sin(theta))
plt.title("sin")
plt.grid()

# 中上
plt.subplot(2, 3, 2)
plt.plot(theta, np.cos(theta))
plt.title("cos")
plt.grid()

# 右上
plt.subplot(2, 3, 3)
plt.plot(theta-np.sin(theta), 1-np.cos(theta))
plt.title("cycloid")
plt.grid()

# 左下
plt.subplot(2, 3, 4)
plt.plot(np.power(np.cos(theta),3), np.power(np.sin(theta),3))
plt.title("asteroid")
plt.grid()

# 中下
plt.subplot(2, 3, 5)
plt.plot((1+np.cos(theta))*np.cos(theta), (1+np.cos(theta))*np.sin(theta))
plt.title("cardioid")
plt.grid()

# 右下
plt.subplot(2, 3, 6)
theta2 = np.arange(0,10*np.pi,0.01) # インボリュート曲線用
plt.plot(np.cos(theta2)+theta2*np.sin(theta2), np.sin(theta2)-theta2*np.cos(theta2))
plt.title("involute of circle")
plt.grid();

<出力結果>
subplot5.png

まとめ

plt.subplotで今回は複数の関数を書くことができるようになりました。
もうこの辺りまで来るとオブジェクト指向の書き方で細かい調整などがしたくなると思います。
オブジェクト指向型での書き方もmatplotlibの公式documentなどで勉強していってください。

6
3
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
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?