今日は matplotlib と SciPy モジュールを使って滑らかな曲線を作成する方法を学びます。
時には、データ可視化のために、プロットをより良く、エレガントに見せるために、滑らかな曲線を得たいと思うことがあります。
幸いなことに、matplotlib と SciPy モジュールの助けを借りれば、同じことが実現できるのです。
お勧めの記事 Pythonでアニメーションプロットを作成する
1. モジュールのインポート
最初のステップは、プログラムに必要なモジュールをインポートすることです。
我々の目的を達成するために必要なモジュールは numpy
, matplotlib
, SciPy
です。
numpy はデータの準備に、matplotlib は簡単なプロットの作成に、SciPy は滑らかな曲線の作成を支援するために必要なモジュールです。
1
2
3
|
import numpy as np
from scipy.interpolate import make_interp_spline
import matplotlib.pyplot as plt
|
2. データの準備
データの準備として、扱いやすいnumpyの配列を使用することにします。
x座標がx軸の値、y座標がxのサイン値で、サイン波をプロットすることにします。
1
2
|
x = np.array([i for i in range ( 50 )])
y = np.array([np.sin(i) for i in x])
|
3. B-スプライン曲線の作成
滑らかな曲線を得るために、make_interp_spline
関数を使用して、xとyの配列を渡すことでBスプライン曲線を得ます。
これは、曲線の x 係数と y 係数を一緒に返します。
次に必要なことは、係数を互いに分離することです。
以下のコードは同じことをやってくれます。
1
2
3
|
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x. min (), x. max (), 500 )
Y_Final = B_spline_coeff(X_Final)
|
4. データセットのプロット
さて、最後のステップは matplotlib ライブラリと、プロットをより良く見せるために必要な関数や設定を使ってプロットすることです。
1
2
3
4
5
6
|
plt.style.use( 'seaborn' )
plt.plot(X_Final,Y_Final,color = "red" )
plt.title( "Smooth Sine Wave" )
plt.xlabel( "x values" )
plt.ylabel( "y values" )
plt.show() |
最終的な出力プロットは以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
plt.figure(figsize = ( 15 , 15 ))
plt.subplot( 3 , 3 , 1 )
x = np.array([i for i in range ( 30 )])
y = np.array([np.tan(i) for i in x])
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x. min (), x. max (), 500 )
Y_Final = B_spline_coeff(X_Final)
plt.style.use( 'seaborn' )
plt.plot(X_Final,Y_Final,color = "red" )
plt.title( "Smooth Tan Wave" )
plt.xlabel( "x values" )
plt.ylabel( "y values" )
plt.subplot( 3 , 3 , 2 )
x = np.array([i for i in range ( 30 )])
y = np.array([np.exp(i) for i in x])
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x. min (), x. max (), 500 )
Y_Final = B_spline_coeff(X_Final)
plt.style.use( 'seaborn' )
plt.plot(X_Final,Y_Final,color = "green" )
plt.title( "Smooth e^x Wave" )
plt.xlabel( "x values" )
plt.ylabel( "y values" )
plt.subplot( 3 , 3 , 3 )
x = np.array([i for i in range ( 10 )])
y = np.array([np.sqrt(i) for i in x])
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x. min (), x. max (), 500 )
Y_Final = B_spline_coeff(X_Final)
plt.style.use( 'seaborn' )
plt.plot(X_Final,Y_Final,color = "pink" )
plt.title( "Smooth sqrt Wave" )
plt.xlabel( "x values" )
plt.ylabel( "y values" )
plt.subplot( 3 , 3 , 4 )
x = np.array([i for i in range ( 30 )])
y = np.array([ 5 * * i for i in x])
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x. min (), x. max (), 500 )
Y_Final = B_spline_coeff(X_Final)
plt.style.use( 'seaborn' )
plt.plot(X_Final,Y_Final,color = "black" )
plt.title( "Smooth 5^x Wave" )
plt.xlabel( "x values" )
plt.ylabel( "y values" )
plt.subplot( 3 , 3 , 5 )
x = np.array([i for i in range ( - 10 , 10 , 1 )])
y = np.array([i * * 2 - 5 for i in x])
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x. min (), x. max (), 500 )
Y_Final = B_spline_coeff(X_Final)
plt.style.use( 'seaborn' )
plt.plot(X_Final,Y_Final,color = "orange" )
plt.title( "Smooth X^2-5 Wave" )
plt.xlabel( "x values" )
plt.ylabel( "y values" )
plt.subplot( 3 , 3 , 6 )
x = np.array([i for i in range ( 30 )])
y = np.array([ 3 * * i + i for i in x])
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x. min (), x. max (), 500 )
Y_Final = B_spline_coeff(X_Final)
plt.style.use( 'seaborn' )
plt.plot(X_Final,Y_Final,color = "magenta" )
plt.title( "Smooth 3^x+x Wave" )
plt.xlabel( "x values" )
plt.ylabel( "y values" )
plt.show() |
アナザーイラスト
次のコードは、matplotlib の subplot
関数を使って、さらにいくつかの滑らかな曲線を一緒にプロットしています。
このコードの出力は以下のように表示されます。
まとめ
今日は、matplotlib と SciPy モジュールを使って完全な滑らかな曲線のプロットを学びました。
他の例も試してみてください。
ハッピーコーディング!
お読みいただきありがとうございました。