Python 绘图弧:绘图中的异常

Python 绘图弧:绘图中的异常,python,numpy,matplotlib,Python,Numpy,Matplotlib,我不明白为什么它没有一直到右侧的\phi轴。我能做些什么来解决这个问题呢?图形不能一直归零的原因是arange从start(第一个参数)开始,然后添加step(第三个参数),直到到达end(第二个参数。但是,end没有添加到末尾。 你应该做的是: import matplotlib.pyplot as plt import numpy as np def arc(): x = np.arange((-np.pi)/4, (np.pi)/4, 0.001) f1 = lambd


我不明白为什么它没有一直到右侧的
\phi
轴。我能做些什么来解决这个问题呢?

图形不能一直归零的原因是
arange
start
(第一个参数)开始,然后添加
step
(第三个参数),直到到达
end
(第二个参数。但是,
end
没有添加到末尾。 你应该做的是:

import matplotlib.pyplot as plt
import numpy as np

def arc():
    x = np.arange((-np.pi)/4, (np.pi)/4, 0.001)

    f1 = lambda x: 3 * (np.cos(2 * x) )**0.5
    plt.vlines(0, 0, 5)
    plt.plot(x, f1(x), label = '$r=3\sqrt{\cos{2\phi}}$')

    plt.xlabel('$\phi$')
    plt.ylabel('$r(\phi)$')
    plt.legend(loc='best')


    axes = plt.gca()
    axes.set_xlim([-np.pi, np.pi])
    axes.set_ylim([0, 5])
    plt.show()

arc()
或者使用速记
np.r\uu

x = np.concatenate((np.arange(-np.pi/4, np.pi/4, 0.001), [np.pi/4]))
我变了
x=np.arange((-np.pi)/4,(np.pi)/4,0.001)

致:

x=np.arange((-np.pi)/4,(np.pi)/4,0.00001)

我得到了

基本上,只需更改步长,以更接近曲线的终点。 然而,这更像是一个不应该做什么的例子(我的猜测被证明是错误的)。 正如@Bas Swinckels的建议更好:

x=np.linspace(-np.pi/4,np.pi/4,npoints)


它完全不需要将最后一个参数更改为接近零的值,这只会使间隙变小(它不会消除间隙)。对于浮点不准确的情况,linspace更好。

获得所需内容的最佳方法是使用。要获得与示例中几乎相同的向量
x
,应执行以下操作

x = np.r_[np.arange(-np.pi/4, np.pi/4, 0.001), np.pi/4]
或者干脆

x = np.linspace(-np.pi/4, np.pi/4, round(np.pi / 2 / 0.001) + 1)
这将为您提供准确的点,并且保证包含开始和停止值

使用
np.arange(start,stop,step)
会给你点
start,start+step,start+2*step,
直到
start+n*step
的最后一点。由于浮点不准确,最后一点的
n
是什么并不明显。
arange
备注:

使用非整数步长(如0.1)时,结果通常不会改变 保持一致。对于这些情况,最好使用linspace

通过使用可变步长在0和1之间生成一些间距,很容易证明这会导致不可预测的行为:

x = np.linspace(-np.pi/4, np.pi/4, npoints)

另请看一个相关问题。

请每个问题只问一个问题。是的,我确实考虑过添加delta x,但没有帮助,有趣的是,你的解决方案是有效的。一个谜。不过谢谢。如果你放大,你会发现仍然有差距。你只是缩小了差距。是的,我知道,这就是为什么
x=np.arange(-np.pi)/4,(np.pi)/4+0.001, 0.001)
更好。我将为clarityNo编辑。这又是同一个问题。我在回答中解释了arange的工作原理。此解决方案可能适用于此特定问题,但在一般情况下可能会产生意外的结果。正如我的示例所示,
arange
的最终值可能非常接近停止值,例如
np.arange(0,1,1.0/98)[-1]-1==-1.11e-16
,因此通过简单地连接最终值,最终的2个点将非常接近。
In [21]: for i in range(97,109):
    ...:     r = np.arange(0, 1, 1. / i)
    ...:     print 'step = 1.0 / {}, length = {}, last value = {}'.format(
    ...:         i, len(r), r[-1])
    ...:     
step = 1.0 / 97, length = 97, last value = 0.989690721649
step = 1.0 / 98, length = 99, last value = 1.0
step = 1.0 / 99, length = 99, last value = 0.989898989899
step = 1.0 / 100, length = 100, last value = 0.99
step = 1.0 / 101, length = 101, last value = 0.990099009901
step = 1.0 / 102, length = 102, last value = 0.990196078431
step = 1.0 / 103, length = 104, last value = 1.0
step = 1.0 / 104, length = 104, last value = 0.990384615385
step = 1.0 / 105, length = 105, last value = 0.990476190476
step = 1.0 / 106, length = 106, last value = 0.990566037736
step = 1.0 / 107, length = 108, last value = 1.0
step = 1.0 / 108, length = 108, last value = 0.990740740741