I used Python3 and Pyplot to do a small exercise. I chose to draw a butterfly curve and chose the colour values to make it look more beautiful! I also hope to make the butterfly really fly through the form of frame animation (although Python will do this very badly).
You can also watch a short animation on YouTube: https://youtu.be/4BXwFqm3TT4
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
#fig, ax = plt.subplots()
fig = plt.figure(figsize=(8, 4.5))
# function - zoom in and zoom out
def call_back(event):
axtemp = event.inaxes
x_min, x_max = axtemp.get_xlim()
y_min, y_max = axtemp.get_ylim()
z_min, z_max = axtemp.get_zlim()
scope = (x_max - x_min) / 10
if event.button == "up":
axtemp.set(xlim = (x_min + scope, x_max - scope))
axtemp.set(ylim = (y_min + scope, y_max - scope))
axtemp.set(zlim = (z_min + scope, z_max - scope))
print('up')
elif event.button == 'down':
axtemp.set(xlim = (x_min - scope, x_max - scope))
axtemp.set(ylim = (y_min - scope, y_max - scope))
axtemp.set(zlim = (z_min - scope, z_max - scope))
print('down')
fig.canvas.draw_idle()
fig.canvas.mpl_connect('scroll_event', call_back)
fig.canvas.mpl_connect('button_press_event', call_back)
ax = fig.add_subplot(111, projection = '3d')
ax.xaxis.set_major_formatter(plt.NullFormatter())
ax.yaxis.set_major_formatter(plt.NullFormatter())
ax.zaxis.set_major_formatter(plt.NullFormatter())
t = np.arange(0.0, 16 * np.pi, 0.01)
x = np.sin(t) * (np.e ** np.cos(t)-2 * np.cos(4 * t) -np.sin(t/12) ** 5)
y = np.cos(t) * (np.e ** np.cos(t)-2 * np.cos(4 * t) -np.sin(t/12) ** 5)
z = pow(x ** 2 + y ** 2, 1/2) + np.cos(t) * np.pi + t ** 1.01 * np.pi
#plt.figure(figsize=(8,6))
#plt.axis("off")
# def update(*args):
# for i in range(100):
# z = z + 1
# return z
plt.scatter(x, y,z, c = t, cmap = 'magma', marker = '+', linestyle = ':')
#anim = animation.FuncAnimation(fig, update, interval=20)
# plt.colorbar()
plt.title("Butterfly Curve")
ax.text(4, 4, 0, "try scroll ❤( •̀_•́)و✧", color='#007aff')
plt.show()