在matplotlib中绘制极坐标系中以r=0为一端的二维线
我想把一些数据用极坐标的方式画出来,都是从r=0开始的。我用线性刻度成功画出来了。但是一旦我开始用对数刻度,结果就很奇怪。我在线的开始和结束位置得到了标记,但中间没有连线……我找到了一种解决办法,就是把线的起点设为r=0.1,这样线就出现了。但是如果我设一个更小的值(比如r=0.001),我又遇到同样的问题,而且坐标的起点意外地向左移动了。你知道有什么解决办法吗?这样我就可以在对数刻度下画出从r=0到某个r的线了。
这里有一个最小可重现示例:
import pylab
import numpy
R = [0.001,1]
Theta = [0,0]
fig = pylab.figure()
host = fig.add_subplot(111, polar=True)
host.plot(Theta,R,color='r',ls='-',lw=2,marker='D',ms=6)
host.set_rlim(0)
host.set_rscale('log')
pylab.show()
2 个回答
0
虽然 Steve Barnes
的说法是完全正确的,但事情并没有那么简单。看起来 matplotlib
在处理对数极坐标图时有些奇怪的地方。
这里有一段示例代码:
import matplotlib.pyplot as plt
import numpy as np
# exponential spiral
theta = np.linspace(0, 20*pi, 10000)
r = np.exp(-theta)
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(theta, r)
ax.set_rscale('log')
运行后得到的结果有点奇怪:
这可能是 y 轴范围的问题:
>>> ax.get_ylim()
(5.1579e-28, 0.0001)
下限是 R 数据中的最小值,这看起来没问题。但是,上限就有点奇怪了(数据中的最大值是 1),而且在对数尺度下,螺旋看起来并不像是指数螺旋(而是线性螺旋)。
如果我强制设置 y 轴范围(或者 r 轴范围):
>>> ax.set_rlim((r[-1],1))
虽然范围改变了,但图形却没有变化。最有趣的是,如果我把光标放到螺旋的外端,图表窗口显示的 r
值是 1。如果我把光标放到外边缘,值就非常接近 1 / r[-1]
(也就是 2 x 10^27)。
所以,似乎在某些版本的 matplotlib
(我用的是 1.3.1)中,对数极坐标图是有问题的。我的猜测是,这个问题可能与对数 Y 轴的缩放和 polar.py
中的 transform_non_affine
之间的相互作用有关。
0
你的问题是因为 log(0.0) 的结果是负无穷大。
In [3]: math.log10(0.3)
Out[3]: -0.5228787452803376
In [4]: math.log10(0.1)
Out[4]: -1.0
In [5]: math.log10(0.01)
Out[5]: -2.0
In [6]: math.log10(0.001)
Out[6]: -3.0
In [7]: math.log10(0.0001)
Out[7]: -4.0
In [8]: math.log10(0.000)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-8-bc8e35603e36> in <module>()
----> 1 math.log10(0.000)
ValueError: math domain error
你需要仔细考虑对数刻度的起始点。如果你希望从“0”这个点开始,那么你的数值必须从 1 开始,(log10(1.0) = 0.0
).