绘制弧线:图中的异常

时间:2015-05-10 18:02:25

标签: python numpy matplotlib

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()

enter image description here

我不明白为什么它不会一直走到右侧的\phi轴。我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:6)

获得所需内容的最佳方式是使用linspace。要获得与示例中几乎相同的向量x,您应该执行

x = np.linspace(-np.pi/4, np.pi/4, round(np.pi / 2 / 0.001) + 1)

或只是

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

这为您提供了完全 npoints点,并且保证包含起始值和停止值。

使用np.arange(start, stop, step)start, start+step, start+2*step, ...提供分数start+n*step < stop,直到n为止。由于浮点不准确,最终点的arange是什么并不明显。 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 评论的manual

  

使用非整数步骤(例如0.1)时,结果通常不会   始终如一。最好在这些情况下使用linspace。

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

UIImageView

另请参阅this answer相关问题。

答案 1 :(得分:1)

图表在右边一直没有变为零的原因是arangestart(第一个参数)开始并添加step(第三个)参数)直到达到end(第二个参数。但是end最后没有添加。 你应该做的是:

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

或使用简写np.r_

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

答案 2 :(得分:1)

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

为:

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

我得到了A closer to perfect plot

基本上,只需更改步骤即可更接近曲线的末端。 然而,这更像是一个不做的例子(我的猜测结果是错误的)。 正如@Bas Swinckels&#39;建议甚至更好:

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

完全摆脱了将最后一个参数更改为接近零的值的需要,这只会使间隙变小(它没有消除差距)。 linspace更适合浮点不准确。