这是两个用于绘制圆形轨迹的 Python 代码示例。它们使用了 numpy、matplotlib 和 ipywidgets 库。代码的目的是根据给定的频率和时间参数,在复平面上绘制圆形轨迹,并使用滑动条实时调整这些参数。下面分别对两个示例进行详细解释。
第一个示例:
导入所需库:numpy、matplotlib、ipywidgets 和 IPython.display。
定义一个名为 draw_circle 的函数,该函数将绘制圆形轨迹。它接受两个参数:频率(f)和时间(t)。
在该函数内部,设置采样率(srate),并根据采样率生成等间隔的时间点。
计算复平面上的圆形轨迹点,然后用 plot 函数绘制平滑的细线条。
添加一个红点,表示圆形轨迹上的最后一个点。
设置坐标轴比例、范围和网格线,然后显示图像。
创建两个滑动条,用于调整频率和时间参数。
使用 ipywidgets.interact 函数将滑动条与 draw_circle 函数关联,实现实时调整。
import numpy as np
import matplotlib.pyplot as plt
import ipywidgets
from IPython.display import clear_output, display
import math
# 定义绘制圆形轨迹的函数
def draw_circle(f, t):
srate = 1000 # 设置采样率
t = np.linspace(0, t, srate) # 根据采样率在时间范围内生成等间隔的点
# 根据频率 f 和时间 t,计算复平面上的圆形轨迹点
p = np.exp(-1j * 2 * math.pi * f * t)
# 绘制平滑的细线条
plt.plot(np.real(p), np.imag(p), linewidth=1)
# 添加红点领导
red_dot = p[-1] # 获取最后一个点作为红点
plt.plot(np.real(red_dot), np.imag(red_dot), "ro")
plt.axis('square') # 设置坐标轴比例相等
plt.axis([-2, 2, -2, 2])
plt.grid() # 显示网格线
plt.show() # 显示图像
# 调节画圆的频率从0.1hz上升到2hz,每次调节改变0.01hz
srate = ipywidgets.IntSlider(
min=1, max=1000, step=1, value=1000,
description='采样率',
continuous_update=True)
# 创建一个滑动条,用于调节画圆的频率,范围从 0.1 Hz 到 2 Hz,步长为 0.01 Hz
f = ipywidgets.FloatSlider(
min=0.1, max=2, step=0.01, value=0.5,
description='频率(Hz)',
continuous_update=True)
# 创建一个滑动条,用于调节画圆的总时间,范围从 0 秒到 10 秒,步长为 0.1 秒
t = ipywidgets.FloatSlider(
min=0, max=10, step=0.1, value=0,
description='时间(秒)',
continuous_update=True)
# 使用 ipywidgets 的交互功能,将滑动条与绘制圆形轨迹的函数关联
ipywidgets.interact(draw_circle, t=t, f=f)
第二个示例:
在导入库和初始化画布后,定义一个名为 draw_circle 的函数,该函数与第一个示例中的函数类似,但有一些差异。
在函数内部,先清除轴上的内容,然后设置轴的范围和比例。
使用 ax.plot 函数绘制圆形轨迹,然后添加一个红点。
使用 clear_output 和 display 函数来清除输出并显示新图像。
创建滑动条和 ipywidgets.interact 函数与第一个示例相同。
#另一种可能
import numpy as np
import matplotlib.pyplot as plt
import ipywidgets
from IPython.display import clear_output, display
import math
# 初始化画布
fig, ax = plt.subplots()
plt.close(fig)
# 定义绘制圆形轨迹的函数
def draw_circle(f, t):
srate = 100 # 设置采样率
t = np.linspace(0, t, srate) # 根据采样率在时间范围内生成等间隔的点
# 根据频率 f 和时间 t,计算复平面上的圆形轨迹点
p = np.exp(-1j * 2 * math.pi * f * t)
ax.clear() # 清除轴上的内容
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)
ax.axis('equal') # 修改为 'equal'
ax.grid()
# 绘制平滑的细线条
ax.plot(np.real(p), np.imag(p), linewidth=1)
# 添加红点领导
red_dot = p[-1] # 获取最后一个点作为红点
ax.plot(np.real(red_dot), np.imag(red_dot), "ro")
clear_output(wait=True) # 清除输出,以便显示新图像
display(fig) # 显示图像
# 创建一个滑动条,用于调节画圆的频率,范围从 0.1 Hz 到 2 Hz,步长为 0.01 Hz
f = ipywidgets.FloatSlider(
min=0.1, max=2, step=0.01, value=0.5,
description='频率(Hz)',
continuous_update=True)
# 创建一个滑动条,用于调节画圆的总时间,范围从 0 秒到 10 秒,步长为 0.1 秒
t = ipywidgets.FloatSlider(
min=0, max=10, step=0.1, value=0,
description='时间(秒)',
continuous_update=True)
# 使用 ipywidgets 的交互功能,将滑动条与绘制圆形轨迹的函数关联
ipywidgets.interact(draw_circle, t=t, f=f)
这两个示例的主要区别在于如何绘制和更新图像。第一个示例直接在全局 plt 对象上绘制,而第二个示例使用了更灵活的子图(ax)对象。第二个示例还使用了 clear_output 函数来更清晰地更新图像。