【Python】matplotlibで正n角形を描画する

プログラミング言語Pythonを利用して正$n$角形を描画するコードを掲載します。

 

 正$n$角形を描画する

Pythonのグラフ描画ライブラリである「matplotlib」を利用してグラフや図形を描画することができます。例えば次のコードを実行すると単位円に内接する正$5$角形が描画されます。

import math
import matplotlib.pyplot as plt

vertex = 5
x_list = [math.cos(2*math.pi*i/vertex) for i in range(0,vertex+1)] # (1,0)が始点
y_list = [math.sin(2*math.pi*i/vertex) for i in range(0,vertex+1)]
# x_list = [math.cos(2*math.pi*i/vertex + math.pi/2) for i in range(0,vertex+1)] # (0,1)が始点
# y_list = [math.sin(2*math.pi*i/vertex + math.pi/2) for i in range(0,vertex+1)]

fig = plt.figure(figsize=(4, 4), dpi=200)
ax = fig.add_subplot(111)
ax.plot(x_list, y_list, c="k", linewidth=1.0 )
ax.axis("off") # 軸をすべて消す

# 各頂点の座標
for i in range(0,vertex):
    print('{:>14.10f}'.format(x_list[i]), '{:>14.10f}'.format(y_list[i]))

plt.show()

コード中の “vertex” の値を変えれば何角形の図でも生成できます。各頂点の$xy$座標も出力するようにしてあります。上の図では$x$軸上の点$(1,\,0)$を始点にしてありますが、初期値の角度を調整することで任意に回転した正$n$角形を描画することができます。

 

 回転した正$n$角形を重ねて描画する

単位円に内接する正$n$角形を回転して重ねた図を描画することもできます。

» コード例

import math
import matplotlib.pyplot as plt

vertex = 5
x_list = [math.cos(2*math.pi*i/vertex) for i in range(0,vertex+1)] # (1,0)が始点
y_list = [math.sin(2*math.pi*i/vertex) for i in range(0,vertex+1)]

fig = plt.figure(figsize=(4, 4), dpi=200)
ax = fig.add_subplot(111)
ax.axis("off") # 軸をすべて消す

rotation = 2
for j in range(0,rotation):
    for i in range(0,vertex):
       x_list = [math.cos(2*math.pi/vertex * (i + j/rotation)) for i in range(0,vertex+1)]
       y_list = [math.sin(2*math.pi/vertex * (i + j/rotation)) for i in range(0,vertex+1)]
       ax.plot(x_list, y_list, c="k", linewidth=1.0 )

plt.show()

» 閉じる

また、パラメータ “alpha” の値を回転数に応じて変動させれば透明度を段階的に変えることもできます。

» コード例

import math
import matplotlib.pyplot as plt

vertex = 4
x_list = [math.cos(2*math.pi*i/vertex) for i in range(0,vertex+1)]
y_list = [math.sin(2*math.pi*i/vertex) for i in range(0,vertex+1)]

fig = plt.figure(figsize=(4, 4), dpi=200)
ax = fig.add_subplot(111)
ax.axis("off") # 軸をすべて消す

rotation = 4
for j in range(0,rotation):
    x_list = [math.cos(2*math.pi/vertex * (i + j/rotation)) for i in range(0,vertex+1)]
    y_list = [math.sin(2*math.pi/vertex * (i + j/rotation)) for i in range(0,vertex+1)]
    ax.plot(x_list, y_list, c="k", linewidth=1.0, alpha=math.exp(-j/2))

plt.show()

» 閉じる


グラデーションになるように色を変えることもできます。

» コード例

import math
from matplotlib import pyplot as plt
from matplotlib import colors

vertex = 4
x_list = [math.cos(2*math.pi*i/vertex) for i in range(0,vertex+1)]
y_list = [math.sin(2*math.pi*i/vertex) for i in range(0,vertex+1)]

fig = plt.figure(figsize=(4, 4), dpi=200)
ax = fig.add_subplot(111)
ax.axis("off") # 軸をすべて消す

rotation = 20
cn = colors.Normalize(0.0, 1.0) # グラデーション用に範囲を正規化
for j in range(0,rotation):
    x_list = [math.cos(2*math.pi/vertex * (i + j/rotation)) for i in range(0,vertex+1)]
    y_list = [math.sin(2*math.pi/vertex * (i + j/rotation)) for i in range(0,vertex+1)]
    ax.plot(x_list, y_list, linewidth=1.0, color=plt.cm.viridis(cn(math.sin(math.pi*j/rotation))))

plt.show()

» 閉じる

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です