使用 matplotlib 创建具有径向对称的形状
Create shapes with radial symmetry using matplotlib
我正在尝试使用 python 生成对称的圆形图像,但找不到简单的方法。
这是我想要的示例:
到目前为止,我列出了流程,但我找不到实现它们的简单方法。:
有简单的方法吗?
我会使用极坐标图,那么这只是计算坐标的问题。为此,我使用 np.linspace
并结合三角圆的划分、相同的点移动 10° 和零点:
import matplotlib.pyplot as plt
from itertools import chain
fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.grid(False)
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
n = 6
# division of the circle
a = np.linspace(0, 2*np.pi, n+1)
# angles
theta = list(chain.from_iterable(zip(a, np.zeros(n+1), a+(np.pi/180*10))))
# distance to center
r = np.tile([1,0,1], n+1)
# plotting line
ax.plot(theta, r)
# plotting fill (needs an extra (0,0) point)
ax.fill(theta+[0], list(r)+[0], alpha=0.2)
示例:
带有循环的示例
import matplotlib.pyplot as plt
import numpy as np
from itertools import chain
fig, axes = plt.subplots(ncols=4, nrows=3, subplot_kw={'projection': 'polar'})
axes = axes.flatten()
def plot_shape(ax, n=3, delta=np.pi/180*10):
ax.grid(False)
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
a = np.linspace(0, 2*np.pi, n+1)-delta/2
theta = list(chain.from_iterable(zip(a, np.zeros(n+1), a+delta)))
r = np.tile([1,0,1], n+1)
ax.plot(theta, r)
ax.fill(theta+[0], list(r)+[0], alpha=0.2)
for i in range(len(axes)):
axes[i].set_title(f'n = {i+1}')
plot_shape(axes[i], n=i+1)
plt.tight_layout()
我正在尝试使用 python 生成对称的圆形图像,但找不到简单的方法。
这是我想要的示例:
到目前为止,我列出了流程,但我找不到实现它们的简单方法。:
有简单的方法吗?
我会使用极坐标图,那么这只是计算坐标的问题。为此,我使用 np.linspace
并结合三角圆的划分、相同的点移动 10° 和零点:
import matplotlib.pyplot as plt
from itertools import chain
fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.grid(False)
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
n = 6
# division of the circle
a = np.linspace(0, 2*np.pi, n+1)
# angles
theta = list(chain.from_iterable(zip(a, np.zeros(n+1), a+(np.pi/180*10))))
# distance to center
r = np.tile([1,0,1], n+1)
# plotting line
ax.plot(theta, r)
# plotting fill (needs an extra (0,0) point)
ax.fill(theta+[0], list(r)+[0], alpha=0.2)
示例:
带有循环的示例
import matplotlib.pyplot as plt
import numpy as np
from itertools import chain
fig, axes = plt.subplots(ncols=4, nrows=3, subplot_kw={'projection': 'polar'})
axes = axes.flatten()
def plot_shape(ax, n=3, delta=np.pi/180*10):
ax.grid(False)
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
a = np.linspace(0, 2*np.pi, n+1)-delta/2
theta = list(chain.from_iterable(zip(a, np.zeros(n+1), a+delta)))
r = np.tile([1,0,1], n+1)
ax.plot(theta, r)
ax.fill(theta+[0], list(r)+[0], alpha=0.2)
for i in range(len(axes)):
axes[i].set_title(f'n = {i+1}')
plot_shape(axes[i], n=i+1)
plt.tight_layout()