ポートフォリオサイト公開中

【python】matplotlibで正多角形や円を描写する

こんにちは、ともろう(@tomorrowSLog)です。

目次
  1. matplotlib.patchesを使って描く
    入力
    出力
    参考
  2. 三角関数を使って描く
    入力(円:r = 1)
    出力
    入力(楕円:長辺 = 2,短編 = 1)
    出力
  3. 円(楕円)をプロットする関数を自作する
    円(楕円)をプロットする関数
    出力
  4. 正多角形を描く
    出力
  5. 乱数と方程式で円を書こうとしてみたけどあまりうまくいかなかった件
    入力
    出力
  6. まとめ

【python】Dataframeの操作まとめ【行列の追加、削除、参照、ソート】

matplotlib.patchesを使って描く

入力

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig = plt.figure()
ax = plt.axes()

c = patches.Circle(xy=(0, 0), radius=1, ec='b', fill=False)
e = patches.Ellipse(xy=(0, 0), width=4, height=2,fill=False)

ax.add_patch(c)
ax.add_patch(e)

plt.axis('scaled')
ax.set_aspect('equal')

patches.Circle()を使うことで円が、patches.Ellipse()を使うことで楕円を描くことができます。

単純に円や楕円を出力させたい場合は、これが一番スマートな方法ではないでしょうか。

最後のplt.axis(‘scaled’)でちょうどいい大きさの出力へ、ax.set_aspect(‘equal’)で正しい縦横比に調整しています。

出力

出力はこんな感じ。

円の引数、ec=’b’で線の色を青色に指定してあります。

またfill=Trueにすることで塗りつぶされた円が出力されます。

参考

カラーコード

b : 青
g : 緑
r : 赤
c : シアン
m : マゼンダ
y: 黄色
k : 黒
w : 白

参考 matplotlib.pyplot.figurematplotlib.org 参考 matplotlib.pyplot.axesmatplotlib.org 参考 matplotlib.patchesmatplotlib.org

三角関数を使って描く

三角関数を組み合わせることでも円や」楕円は表現できます。

入力(円:r = 1)

import numpy as np
import math
x,y= [],[]
for j in np.linspace(0, 2 * np.pi, 1000):
      x.append(math.sin(j))
      y.append(math.cos(j))

plt.figure(figsize=(3, 3))
plt.plot(x,y)
plt.show()

出力

綺麗な単位円を描くことができました。

円の出力と言っていますが、厳密には頂点を999個持っている正多角形です。

入力(楕円:長辺 = 2,短編 = 1)

import numpy as np
import math
x,y= [],[]
for j in np.linspace(0, 2 * np.pi, 1000):
      x.append(math.sin(j) * 2)
      y.append(math.cos(j) * 1)
      
plt.figure(figsize=(6, 3))
plt.plot(x,y)
plt.show()

単位円ができれば楕円も簡単に描けてしまいます。

出力

円(楕円)をプロットする関数を自作する

これらを応用して、原点(x, y)と長辺a, 短辺bを自由に設定して円や楕円をプロットする関数を作ります。

円(楕円)をプロットする関数

円(楕円)をプロットする関数
import numpy as np
import math

def draw_circle(_x = 0, _y = 0, a = 1, b = 1):
  fig = plt.figure()
  ax = plt.axes()
  
  x,y= [],[]
  for j in np.linspace(0, 2 * np.pi, 1000):
        x.append(math.sin(j) * a + _x)
        y.append(math.cos(j) * b + _y)

  plt.plot(x,y)
  plt.axis('scaled')
  ax.set_aspect('equal')
  plt.show()

自作関数にx = 2, y = -1, a = 3, b = 2を入れてみます。

draw_circle(2, -1, 3, 2) >>

出力

見事に中心点(2, -1)で長辺が3、短辺が2の楕円がプロットされました。

正多角形を描く

先ほど三角関数で円を描いた時、これは円ではなく厳密には正多角形だと言いました。

裏を返せば、正三角形や正方形などの多角形を描くこともできます。やっていきましょう。

先ほどまでは

for j in np.linspace(0, 2 * np.pi, 1000)

としていた1000の部分を変えていきます。

正三角形から正十一角形まで一度にプロットしていきます。

グラフタイトルの”i = “の部分は1000の部分にどんな数字を入れたかを表します。

import numpy as np
import math

fig = plt.figure(figsize=(9, 9))
plt.subplots_adjust(wspace=0.5, hspace=0.5)
for i in range(9):
  x,y= [],[]
  for j in np.linspace(0, 2 * np.pi, i+4):
      x.append(math.sin(j))
      y.append(math.cos(j))
      
  sub = fig.add_subplot(3, 3, 1+i)
  sub.set_xlim([-1.1,1.1])
  sub.set_ylim([-1.1,1.1])
  sub.plot(x,y)
  sub.set_title("i = {}".format(i + 4))

plt.show()

出力

中心と頂点の距離が1の正多角形がプロットされました。

先ほどまではこのiの部分を限りなく大きくすることで円に近似させ、円をプロットしていたんですね。

ちなみに

for j in np.linspace(0, 2 * np.pi, 1000)

これを

for j in np.linspace(0.25 * np.pi, 2.25 * np.pi, 1000)

とすることで、π/4回転した図形を得ることもできます。

開始位置と終了位置を0.25πずらすことで回転させています。

乱数と方程式で円を書こうとしてみたけどあまりうまくいかなかった件

最初は乱数とx^2 + y^2 = 1を使って円かいて見ようかなと思って遊んでたんだけど、あまりうまくいかなかったんだよね。

入力

def create_dataset(N):
  x = np.random.rand(N) * 2 - 1
  y = (1 - x**2) ** (1/2) * np.random.choice([-1,1], N)
  return x, y

x, y = create_dataset(1000)
plt.scatter(x, y)
plt.axis('scaled')
plt.show()

出力

N = 1000でこんな感じ。乱数で-1から1を出して、y = ±√(1 – x^2)に代入ってな感じ。

Nをもっとでかくすれば描けるだろうけど、x = -1と1の近くでの防御力が薄め。

理由はなんとなくわかるようなわからないようなって感じです。

まとめ

いろんな図をプロットするの楽しい

以上

ではでは

コメントを残す

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