つれづれなる備忘録

日々の発見をあるがままに綴る

Pythonによるデータ処理20 ~ 複雑なグラフを生成する関数プロット

今回は、複雑なグラフを生成する関数をPythonでプロットしたものを紹介する。

1. ハート型

プロットする関数は以下の通り:

 y= ( ( \tan x + \sin (ax^{2} ))\cos (x) )^{2}

aをパラメータとしてプロットするとハートの範囲が変わっていく。a=0の場合は、sin2xとなるため、ただの三角関数のプロットになる。

import numpy as np
import matplotlib.pyplot as plt

x=np.arange(-20,20,1e-3)
plt.figure(figsize=(20,15))
i=1
for a in np.arange(-10,11,1):
  y=((np.tan(x)+np.sin(a*x**2))*np.cos(x))**2
  plt.subplot(21,1,i)
  plt.plot(x,y,'m')
  plt.text(-20,0,'a=' + str(a),backgroundcolor='white')
  i=i+1

"ハートプロット"
ハートプロット

2. 波紋

 次は波紋状の模様を生成する関数:

 \cos (ax-y) = \sin (x^{2}+by^{2} )

今回はyについて表現しにくい陰関数をプロットする方法として、3次元のコンタープロットを作成し、Z=0と交わる等高線を表示する。 X,Yのメッシュグリッドを生成し、上の式を変形し Z=np.cos(a*X-Y)-np.sin(X**2+b*Y**2)として、plt.contour(X, Y, Z, [0])でZ=0の等高線を描画する。

delta = 0.01
xrange = np.arange(-5, 5, delta)
yrange = np.arange(-5, 5, delta)
X, Y = np.meshgrid(xrange,yrange)
i=1
plt.figure(figsize=(12,12))
for d in np.arange(-8,8,1):
  a=d
  b=d
  Z=np.cos(a*X-Y)-np.sin(X**2+b*Y**2)
  plt.subplot(4,4,i)
  plt.contour(X, Y, Z, [0])
  plt.axis('equal')
  plt.text(-6,4,'a='+str(a),backgroundcolor='white')
  plt.text(-6,3,'b='+str(b),backgroundcolor='white')
  i=i+1

"波紋"
波紋

パラメータa,bが負のときは双曲線、正のときは放物線として振舞うことがわかる。

3. 波線模様

最後は、パラメータによって変化する波線模様:

 ax\cos y= b\cos x

波紋の時と同様に陰関数をプロットするためコンタープロットを利用する。

a=np.arange(12,-12,-2)
b=np.arange(50,200,10)
delta = 0.1
xrange = np.arange(-25, 25, delta)
yrange = np.arange(-25, 25, delta)
X, Y = np.meshgrid(xrange,yrange)
plt.figure(figsize=(12,12))
i=1
for a, b in zip(a,b):
  Z=a*X*np.cos(Y)-b*np.cos(X)
  plt.subplot(4,4,i)
  plt.contour(X, Y, Z, [0])
  plt.axis('equal')
  plt.text(-15,15,'a='+str(a),backgroundcolor='white')
  plt.text(-15,10,'b='+str(b),backgroundcolor='white')
  i=i+1

a=0の時はb cos(x)=0となるため、x=nπ/2の位置で直線(縦線)となるが、それ以外ではa,bの値によって波線が変化していく。

"波線"
波線

4. まとめ

今回は複雑なグラフを生成する関数をPythonでプロットした結果とコードを紹介した。