[英]Plotted arc: anomaly in the plot
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()
我不明白为什么它不会一直到右侧的\\phi
轴。 我该怎么做才能解决这个问题?
获得所需内容的最佳方法是使用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
的言论:
使用非整数步骤(例如0.1)时,结果通常不一致。 最好在这些情况下使用linspace。
通过使用可变步长生成0到1之间的一些范围,很容易证明这会导致不可预测的行为:
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
另见相关问题的答案 。
图形在右边没有一直到零的原因是因为arange
在start
(第一个参数)开始并添加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]
我改变了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更适合浮点不准确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.