Python 如何在matplotlib中使用极轴上的对数比例

Python 如何在matplotlib中使用极轴上的对数比例,python,matplotlib,polar-coordinates,Python,Matplotlib,Polar Coordinates,我试图创建一个极坐标图,在径向轴上有一个对数刻度,但我一直得到一个错误。下面是一些示例代码和错误。在笛卡尔坐标系下似乎很好,有人知道发生了什么吗 import matplotlib.pyplot as plt import numpy as np import matplotlib.cm as cm bazbins = np.linspace(0, 2*np.pi, 360) fbins = np.logspace(np.log10(0.05), np.log10(0.5), 101) the

我试图创建一个极坐标图,在径向轴上有一个对数刻度,但我一直得到一个错误。下面是一些示例代码和错误。在笛卡尔坐标系下似乎很好,有人知道发生了什么吗

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm

bazbins = np.linspace(0, 2*np.pi, 360)
fbins = np.logspace(np.log10(0.05), np.log10(0.5), 101)
theta, r = np.meshgrid(bazbins, fbins) 

# Set up plot window
fig, ax = plt.subplots(figsize=(12,9))#, subplot_kw=dict(projection='polar'))

# polar
ax.set_theta_zero_location('N')
ax.set_theta_direction(-1)
ax.set_rscale('log')

# carthesia
#ax.set_yscale('log')

# Plot data
#ax.pcolormesh(theta, r, r)
plt.gca().invert_yaxis()
ax.contourf(theta, r, r)
ax.set_ylim((0.0, 0.5))
plt.show()
Tkinter回调中出现异常:

Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 236, in resize
    self.show()
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 239, in draw
    FigureCanvasAgg.draw(self)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.py", line 421, in draw
    self.figure.draw(self.renderer)
  File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/figure.py", line 898, in draw
    func(*args)
  File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 1997, in draw
    a.draw(renderer)
  File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 1045, in draw
    tick.draw(renderer)
  File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 239, in draw
    self.label1.draw(renderer)
  File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/text.py", line 591, in draw
    ismath=ismath)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.py", line 156, in draw_text
    return self.draw_mathtext(gc, x, y, s, prop, angle)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.py", line 145, in draw_mathtext
    x = int(x) + ox
ValueError: cannot convert float NaN to integer

当我在设置绘图窗口的行中取出注释时,它会为我运行

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm

bazbins = np.linspace(0, 2*np.pi, 360)
fbins = np.logspace(np.log10(0.05), np.log10(0.5), 101)
theta, r = np.meshgrid(bazbins, fbins) 

# Set up plot window
fig, ax = plt.subplots(figsize=(12,9), subplot_kw=dict(projection='polar'))

# polar
ax.set_theta_zero_location('N')
ax.set_theta_direction(-1)
ax.set_rscale('log')

plt.gca().invert_yaxis()
ax.contourf(theta, r, r)
ax.set_ylim((0.0, 0.5))
plt.show() 

Set_ylim()
之后设置
rscale
,就像上面评论中回答的θ一样。

这似乎是matplotlib中的一个错误。在
set\u rscale
(或
set\u yscale
)之前,不必调用
set\u rlim
(或
set\u yscale
)方法。此外,必须调用
set_rlim
set_ylim
,下限为0或0.0。下限的其他值也会导致崩溃。这个问题也发生在其他后端(我已经确认了gtkagg和pdf后端的问题)

我为这个问题提交了一份bug报告,可以找到。如果此问题影响您,请转到错误报告页面并留下评论,让matplotlib开发人员知道此问题对用户很重要。

更新为
matplotlib v3.3.4
  • 更新
    def scatter\u logpolar\u mpl
    以使用
    'symlog'
    ,因为使用
    'log'
    会导致
    posx和posy应该是有限值
    ,并且
    'log-polar matplotlib'的空绘图
#用symlog更新了函数
def散射对数极坐标mpl(ax、θ、r):
最大散射(θ,r)
ax.set_rlim(0)
ax.set\u rscale('symlog')
ax.set_title('log-polar matplotlib')
#使用其他未更改的原始功能
#设置绘图
r=np.arange(0,3.0,0.01)+0.001
θ=2*np.pi*r
ax=plt.subplot(1,3,subplot_kw=dict(polar=True),figsize=(12,7))[1].flatten()
散射极坐标(ax[0],θ,r)
散射对数极坐标(ax[1],θ,r)
散射对数极坐标(ax[2],θ,r)
plt.紧_布局()
plt.show()

原始答案 当前matplotlib和对数极坐标图存在更多问题

例如,尝试在For polar plots中为半径添加一个小值,然后使用
set_rlim(0)
set_rscale('log')
对其进行打印(如这里的注释所示)。所有低于0.1的值都会得到一些特殊处理。这会影响
r
轴上的刻度(注意完全错位的10e-2和10e-3)以及打印数据:

这种行为似乎没有记录在案。我最终手动完成了日志转换(上面系列中的第三个绘图)。对于遇到此线程的其他人,以下是我的代码:

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

我尝试了
set\u rscale
set\u ylim
但没有显示网格线。还有一些非常小的坐标(r~0.02)没有被绘制出来。想知道是否在某个时候引入了bug?