<h2>更新为<code>matplotlib v3.3.4</code></h2>
<ul>
<li>更新<code>def scatter_logpolar_mpl</code>以使用<code>'symlog'</code>,因为使用<code>'log'</code>会导致<code>posx and posy should be finite values</code>,并且<code>'log-polar matplotlib'</code>的绘图为空</李>
</ul>
<pre class="lang-py prettyprint-override"><code># updated function with symlog
def scatter_logpolar_mpl(ax, theta, r):
ax.scatter(theta, r)
ax.set_rlim(0)
ax.set_rscale('symlog')
ax.set_title('log-polar matplotlib')
# use other unchanged original functions
# setup the plot
r = np.arange(0, 3.0, 0.01) + 0.001
theta = 2 * np.pi * r
ax = plt.subplots(1, 3, subplot_kw=dict(polar=True), figsize=(12, 7))[1].flatten()
scatter_polar_mpl(ax[0], theta, r)
scatter_logpolar_mpl(ax[1], theta, r)
scatter_logpolar(ax[2], theta, r)
plt.tight_layout()
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/MGQye.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/MGQye.png" alt="enter image description here"/></a></p>
<h2>原始答案</h2>
<p>当前matplotlib和对数极坐标图存在更多问题</p>
<p>例如,尝试为极坐标图的<a href="http://matplotlib.org/examples/pylab_examples/polar_demo.html" rel="nofollow noreferrer">matplotlib example</a>中的半径添加一个小值,然后使用<code>set_rlim(0)</code>和<code>set_rscale('log')</code>对其进行绘制(如这里的注释所示)。所有低于0.1的值都会得到一些特殊处理。这会影响<code>r</code>轴上的刻度(注意完全错位的10e-2和10e-3)以及打印数据:</p>
<p><img src="https://i.stack.imgur.com/4Jv1V.png" alt="Examples of polar and log-polar plots"/></p>
<p>这种行为似乎没有记录在案。我最终手动完成了日志转换(上面系列中的第三个绘图)。对于遇到此线程的其他人,以下是我的代码:</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
def scatter_polar_mpl(ax, theta, r):
ax.scatter(theta, r)
ax.set_rlim(0)
ax.set_title('polar matplotlib')
def scatter_logpolar_mpl(ax, theta, r):
ax.scatter(theta, r)
ax.set_rlim(0)
ax.set_rscale('log')
ax.set_title('log-polar matplotlib')
def scatter_logpolar(ax, theta, r_, bullseye=0.3, **kwargs):
min10 = np.log10(np.min(r_))
max10 = np.log10(np.max(r_))
r = np.log10(r_) - min10 + bullseye
ax.scatter(theta, r, **kwargs)
l = np.arange(np.floor(min10), max10)
ax.set_rticks(l - min10 + bullseye)
ax.set_yticklabels(["1e%d" % x for x in l])
ax.set_rlim(0, max10 - min10 + bullseye)
ax.set_title('log-polar manual')
return ax
r = np.arange(0, 3.0, 0.01) + 0.001
theta = 2 * np.pi * r
ax = plt.subplots(1, 3, subplot_kw=dict(polar=True))[1].flatten()
scatter_polar_mpl(ax[0], theta, r)
scatter_logpolar_mpl(ax[1], theta, r)
scatter_logpolar(ax[2], theta, r)
plt.show()
</code></pre>