The Archimedean spiral (but not quite!)
I was plotting the Archimedean spiral in Python, which should look something like this:
The spiral can be drawn using polar coordinates, where it is defined as r = phi
. I noticed that if you discretize the angle phi
using np.linspace
but make your step too big, lines are drawn between too distant points to result in a spiral. Instead, you get all sorts of really cool patterns!
I made an animation changing the final angle phi
but keeping the number of points in np.linspace
small (100):
Finally, if you get the ratio of end
to n_points
right, you still pick up the spiral pattern, but at a larger scale than the original spiral! This can be seen below with the sufficiently discretized spiral plotted in gray in the background:
The code to re-create the animation above is quite simple:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig = plt.figure(figsize=(6,6))
ax = plt.axes(xlim=(-150, 150), ylim=(-150, 150))
plt.axis('equal')
ax.spines["top"].set_visible(False)
ax.spines["bottom"].set_visible(False)
ax.spines["right"].set_visible(False)
ax.spines["left"].set_visible(False)
plt.xticks([])
plt.yticks([])
line, = ax.plot([], [], 'k', lw=1)
def init():
line.set_data([], [])
return line,
def animate(i):
end = 100 + 1.5*i
n_points = 100
phi = np.linspace(0,end,n_points)
r = phi
x = r * np.cos(phi)
y = r * np.sin(phi)
line.set_data(x, y)
return line,
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=250)
anim.save("archimedean-spiral.gif", writer='imagemagick', fps=8)
or you can plot a single snapshot:
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(6,6))
end = 100
n_points = 100
phi = np.linspace(0,end,n_points)
r = phi
x = r * np.cos(phi)
y = r * np.sin(phi)
ax = plt.axes()
plt.plot(x, y, 'k')
plt.xticks([])
plt.yticks([])
ax.spines["top"].set_visible(False)
ax.spines["bottom"].set_visible(False)
ax.spines["right"].set_visible(False)
ax.spines["left"].set_visible(False)
plt.grid(alpha=0.3)
plt.axis('equal')
plt.savefig('archimedean_spiral_' + str(end) + '_' + str(n_points) + '.png')
Yes, this is how the PCAfold logo has been created!