import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
# 사인 함수 그래프를 그리는 함수
def plot_sine(A, B, C, D):
x = np.linspace(-2 * np.pi, 2 * np.pi, 1000) # x 범위 설정
y = A * np.sin(B * x + C) + D # 사인 함수
ax.clear() # 이전 그래프를 지우기
ax.plot(x, y, label=f"${A} \\sin({B}x + {C}) + {D}$")
ax.set_title('Sine Function')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid(True)
ax.axhline(0, color='black', linewidth=0.5)
ax.axvline(0, color='black', linewidth=0.5)
ax.legend()
ax.set_ylim(D - abs(A) - 1, D + abs(A) + 1) # y축 범위 설정
plt.draw()
# 초기 값 설정
A_init = 1
B_init = 1
C_init = 0
D_init = 0
# 플롯과 슬라이더 설정
fig, ax = plt.subplots(figsize=(10, 6))
plt.subplots_adjust(left=0.1, bottom=0.25)
# 슬라이더 정의
axcolor = 'lightgoldenrodyellow'
ax_amp = plt.axes([0.1, 0.1, 0.65, 0.03], facecolor=axcolor)
ax_freq = plt.axes([0.1, 0.15, 0.65, 0.03], facecolor=axcolor)
ax_phase = plt.axes([0.1, 0.2, 0.65, 0.03], facecolor=axcolor)
ax_vert = plt.axes([0.1, 0.25, 0.65, 0.03], facecolor=axcolor)
s_amp = Slider(ax_amp, 'Amplitude (A)', 0.1, 10.0, valinit=A_init)
s_freq = Slider(ax_freq, 'Frequency (B)', 0.1, 10.0, valinit=B_init)
s_phase = Slider(ax_phase, 'Phase Shift (C)', -2*np.pi, 2*np.pi, valinit=C_init)
s_vert = Slider(ax_vert, 'Vertical Shift (D)', -10.0, 10.0, valinit=D_init)
# 슬라이더의 값이 변경될 때마다 호출되는 함수
def update(val):
A = s_amp.val
B = s_freq.val
C = s_phase.val
D = s_vert.val
plot_sine(A, B, C, D)
# 슬라이더에 이벤트 연결
s_amp.on_changed(update)
s_freq.on_changed(update)
s_phase.on_changed(update)
s_vert.on_changed(update)
# 초기 그래프 그리기
plot_sine(A_init, B_init, C_init, D_init)
plt.show()