[matplotlibで錯視] 5. エーレンシュタイン錯視1

その他

matplotlibでエーレンシュタイン錯視1を作成する

エーレンシュタイン錯視とは?

エーレンシュタイン錯視とは、同心円の内側にある正方形の辺が、歪んで見える錯視のことである。このエーレンシュタイン錯視をmatplotlibを用いて作成する。

コード

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['savefig.dpi']=150
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111)
#ax.yaxis.set_major_locator(plt.MultipleLocator(0.2))
fig.patch.set_facecolor('white') # 図の背景
ax.patch.set_facecolor('white') # axの背景
plt.tick_params(labelbottom=False, labelleft=False)
plt.tick_params(color='white')
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['bottom'].set_visible(False)
t = np.linspace(0, 2*np.pi, 100)
c, s = np.cos(t), np.sin(t)
a=1
b=1
p=1
x = np.abs(c)**(2/p) * a * np.sign(c)
y = np.abs(s)**(2/p) * b * np.sign(s)
#四角
ax.plot(x,y,'k-',lw=2)
#円
[ax.plot(i*c,i*s,'k-', lw=2) for i in np.arange(0.2,1.2,0.05)]
ax.axis('scaled')
plt.savefig("Ehrenstein.png",bbox_inches = 'tight', pad_inches = 0)
plt.show()
view raw Ehrenstein1.py hosted with ❤ by GitHub

解説

モジュールのインポートと図の作成

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['savefig.dpi']=150
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111)
view raw Ehrenstein1.py hosted with ❤ by GitHub

背景色の設定

fig.patch.set_facecolor('white') # 図の背景
ax.patch.set_facecolor('white') # axの背景
view raw Ehrenstein1.py hosted with ❤ by GitHub

fig.patch.set_facecolor(‘white’), ax.patch.set_facecolor(‘white’) で図を含めた画像全体の背景と図の背景を白にしている。

目盛と目盛ラベルを非表示

plt.tick_params(labelbottom=False, labelleft=False)
plt.tick_params(color='white')
view raw Ehrenstein1.py hosted with ❤ by GitHub

plt.tick_params(labelbottom=False, labelleft=False)で目盛ラベルを非表示にし、plt.tick_params(color=’white’)で目盛を白にして見えなくしている。

図の枠線の設定

ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['bottom'].set_visible(False)
view raw Ehrenstein1.py hosted with ❤ by GitHub

図の枠線は、ax.spines[‘left’].set_visible(False)のようにすることで上下左右の枠線を非表示にできる。

円と四角を表示するためのパラメータ

t = np.linspace(0, 2*np.pi, 100)
c, s = np.cos(t), np.sin(t)
view raw Ehrenstein1.py hosted with ❤ by GitHub

四角と円を表示するためのパラメータとして、tとc,sを用いた。tは0〜2πのlinspace配列で、c,sはそのtを用いたcosとsinである。

四角の表示

a=1
b=1
p=1
x = np.abs(c)**(2/p) * a * np.sign(c)
y = np.abs(s)**(2/p) * b * np.sign(s)
#四角
ax.plot(x,y,'k-',lw=2)
view raw Ehrenstein1.py hosted with ❤ by GitHub

四角はスーパー楕円の式を用いて生成した。詳細は、下記を参照。

[matplotlib animation] 17. スーパー楕円(Superellipse)
matplotlib FuncAnimationによるスーパー楕円のアニメーションについて説明する。

円の表示

#円
[ax.plot(i*c,i*s,'k-', lw=2) for i in np.arange(0.2,1.2,0.05)]
view raw Ehrenstein1.py hosted with ❤ by GitHub

[ax.plot(i*c,i*s,’k-‘, lw=2) for i in np.arange(0.2,1.2,0.05)]のように、リスト内包表記で、半径がnp.arange(0.2,1.2,0.05)となる円を順次、描写していく。’k-‘, lw=2としているので、linewidthが2の黒い実線の円が表示される。

アスペクト比の調整

ax.axis('scaled')
view raw Ehrenstein1.py hosted with ❤ by GitHub

デフォルトの設定では、円が歪んでしまうので、ax.axis(‘scaled’)とすることで、xとy軸の表示間隔を揃えて、真円が表示されるようにしている。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

参考

エーレンシュタイン錯視 - Wikipedia

コメント