在matplotlib中绘制极坐标系中以r=0为一端的二维线

1 投票
2 回答
1023 浏览
提问于 2025-04-18 13:04

我想把一些数据用极坐标的方式画出来,都是从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).

撰写回答