用Python(matplotlib)绘制切线图

4
今天我决定在考试前写一个简单的Python程序来练习。首先,我想画出正弦和余弦图表,这并不太难。但后来,我决定挑战自己并画出切线图表。
import pylab as p

x= p.arange(-1.0,1.0,0.1)
y= (p.sin(2*p.pi*x)) / (p.cos(2*p.pi*x))

p.plot(x,y,'g-',lw=1)
p.show()

它返回......嗯......这个:

在此输入图片描述

正如你所看到的,它看起来更像是ECK图而不是切线图。有人知道问题出在哪里吗?


1
尝试减小步长。 - M4rtini
基本上,Python试图在给定一组点的情况下绘制连续的图形,但切线并非在任何地方都是连续的。您应该特别注意处理不连续点(pi/2, 3pi/2 ...),或者只绘制点而不连接它们的线。 - Manuel Pena
2个回答

6
如果您增加x中的点数,
import pylab as p
import numpy as np
x = p.linspace(-1.0, 1.0, 1000)
y = (p.sin(2 * p.pi * x)) / (p.cos(2 * p.pi * x))
p.plot(x, y, 'g-', lw=1)
p.show()

你会得到类似这样的东西: enter image description here 注意,y轴范围变得非常大。由于范围太大,Matplotlib无法显示正切曲线中的小值。可以通过忽略渐近线附近的极大值来改进绘图。使用Paul's workaround处理渐近线。
import pylab as p
import numpy as np
x = p.linspace(-1.0, 1.0, 1000)
y = (p.sin(2 * p.pi * x)) / (p.cos(2 * p.pi * x))

tol = 10
y[y > tol] = np.nan
y[y < -tol] = np.nan

p.plot(x, y, 'g-', lw=1)
p.show()

你得到

enter image description here


谢谢你,又提供了一个很好的解决方案,我会完美地通过考试的 ;) - Szczepenson
@Szczepenson:祝你好运! - unutbu

4
import pylab as p

x= p.arange(-1.0,1.0,0.01)  # <- 0.01 step size.
y= (p.sin(2*p.pi*x)) / (p.cos(2*p.pi*x))
# y = p.tan(2*p.pi*x)
p.plot(x,y,'g-',lw=1)
p.ylim([-4, 4]) # <- Restricting the ylim so we don't see the ~inf values. 
p.show()

如果您不设置ylim,结果将是这样的(值会趋近于无穷大)。 没有设置ylim的结果 如果设置了ylim,结果如下所示。 结果

1
非常感谢,我之前不知道ylim(),它真的很有用! - Szczepenson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接