@@ -41,20 +41,50 @@ def derivative(func, x, h=1e-5):
4141x_vals = np .linspace (x_range [0 ], x_range [1 ], num = 51 )
4242f_vals = f (x_vals )
4343
44- # Initialize the Plotly figure and plot the original function.
44+ # Initialize the Plotly figure
4545fig = go .Figure ()
46- fig .add_trace (go .Scatter (x = x_vals , y = f_vals , mode = 'lines' , name = 'Function' ))
46+
47+ # Adjust padding for final layout
48+ pad = min (np .abs (np .min (f_vals )), np .abs (np .max (f_vals ))) + (max (np .abs (np .min (f_vals )), np .abs (np .max (f_vals ))) // 20 )
49+
50+ # Set the final y-axis range with padding
51+ y_min = np .min (f_vals ) - pad
52+ y_max = np .max (f_vals ) + pad
53+
54+ # Vertical line at x=0 (y-axis)
55+ if x_range [0 ] < 0 < x_range [1 ]:
56+ fig .add_trace (go .Scatter (
57+ x = [0 , 0 ],
58+ y = [y_min , y_max ],
59+ mode = 'lines' ,
60+ line = dict (color = 'silver' , width = 2 ),
61+ showlegend = False
62+ ))
63+
64+ # Horizontal line at y=0 (x-axis)
65+ if y_min < 0 < y_max :
66+ fig .add_trace (go .Scatter (
67+ x = [x_range [0 ], x_range [1 ]],
68+ y = [0 , 0 ],
69+ mode = 'lines' ,
70+ line = dict (color = 'silver' , width = 2 ),
71+ showlegend = False
72+ ))
73+
74+ # Plot the original function
75+ fig .add_trace (go .Scatter (x = x_vals , y = f_vals , mode = 'lines' , name = 'Function' , line = dict (color = '#6570f9' , width = 2 )))
4776
4877# Calculate the tangent line at the starting point x_range[0].
4978x0 = x_range [0 ]
5079tangent_y = derivative (f , x0 ) * (x_vals - x0 ) + f (x0 )
51- fig .add_trace (go .Scatter (x = x_vals , y = tangent_y , mode = 'lines' , name = 'Tangent' ))
80+ fig .add_trace (go .Scatter (x = x_vals , y = tangent_y , mode = 'lines' , name = 'Tangent' , line = dict ( color = '#eb553d' , width = 2 ) ))
5281
5382# Add a marker for the point of tangency.
5483fig .add_trace (go .Scatter (x = [x0 ], y = [f (x0 )],
55- mode = 'markers' ,
56- marker = dict (size = 12 , color = 'green' ),
57- name = 'Point' ))
84+ mode = 'markers' ,
85+ marker = dict (size = 12 , color = 'green' ),
86+ name = 'Point' )
87+ )
5888
5989# Set the initial layout title with the slope at the starting point.
6090fig .update_layout (title = (f'Slope Value = { derivative (f , x0 ):.4f} ' ), title_font_size = 16 )
@@ -65,18 +95,30 @@ def derivative(func, x, h=1e-5):
6595# Create frames for the animation slider.
6696frames = []
6797for slider_val in x_vals :
68- # Compute the tangent line at each slider value using our numerical derivative.
69- save_deriv = derivative (f , slider_val )
70- tan_y = save_deriv * (x_vals - slider_val ) + f (slider_val )
71- frames .append (go .Frame (
72- data = [
73- go .Scatter (), # Placeholder for the function trace (remains unchanged).
74- go .Scatter (x = x_vals , y = tan_y ), # Tangent line.
75- go .Scatter (x = [slider_val ], y = [f (slider_val )]) # Point of tangency.
76- ],
77- layout = go .Layout (title = (f'Slope Value = { save_deriv :.4f} ' ), yaxis_range = initial_yaxis , yaxis = {'autorange' :False }),
78- name = str (slider_val )
79- ))
98+ # Compute the tangent line at each slider value using our numerical derivative.
99+ save_deriv = derivative (f , slider_val )
100+ tan_y = save_deriv * (x_vals - slider_val ) + f (slider_val )
101+ frame_data = []
102+
103+ # Conditionally add vertical line at x=0
104+ if x_range [0 ] < 0 < x_range [1 ]:
105+ frame_data .append (go .Scatter (x = [0 , 0 ], y = [y_min , y_max ]))
106+
107+ # Conditionally add horizontal line at y=0
108+ if y_min < 0 < y_max :
109+ frame_data .append (go .Scatter (x = [x_range [0 ], x_range [1 ]]))
110+
111+ # Placeholder for the function trace (remains unchanged)
112+ frame_data .append (go .Scatter ())
113+ frame_data .append (go .Scatter (x = x_vals , y = tan_y )) # Tangent line
114+ frame_data .append (go .Scatter (x = [slider_val ], y = [f (slider_val )])) # Point of tangency
115+
116+ frames .append (go .Frame (
117+ data = frame_data ,
118+ layout = go .Layout (title = (f'Slope Value = { save_deriv :.4f} ' ), yaxis_range = initial_yaxis , yaxis = {'autorange' :False }),
119+ name = str (slider_val )
120+ ))
121+
80122fig .frames = frames
81123
82124# Create a slider to control the animation.
@@ -104,13 +146,11 @@ def derivative(func, x, h=1e-5):
104146 pad = {"t" : 10 , "b" : 10 },
105147)]
106148
107- # Adjust padding and final layout settings.
108- pad = min (np .abs (np .min (f_vals )), np .abs (np .max (f_vals ))) + (max (np .abs (np .min (f_vals )), np .abs (np .max (f_vals ))) // 20 )
109149fig .update_layout (
110150 xaxis_title = 'x-axis' ,
111151 yaxis_title = 'y-axis' ,
112- xaxis = dict (range = [x_range [0 ], x_range [1 ]], fixedrange = True , linewidth = 2 , linecolor = 'silver' ),
113- yaxis = dict (range = [np . min ( f_vals ) - pad , np . max ( f_vals ) + pad ], fixedrange = True , linewidth = 2 , linecolor = 'silver' ),
152+ xaxis = dict (range = [x_range [0 ], x_range [1 ]], fixedrange = True ),
153+ yaxis = dict (range = [y_min , y_max ], fixedrange = True ),
114154 sliders = sliders ,
115155 uirevision = 'static' ,
116156 margin = dict (t = 50 , r = 0 ,l = 60 ),
0 commit comments