gpt4 book ai didi

python - 如何在 matplotlib 中的极轴上使用对数刻度

转载 作者:太空宇宙 更新时间:2023-11-03 13:02:33 26 4
gpt4 key购买 nike

我正在尝试创建一个在径向轴上具有对数刻度的极坐标图,但我一直收到错误消息。下面是一些示例代码和错误。它似乎在笛卡尔坐标中工作正常,有人知道发生了什么吗??

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

最佳答案

已更新 matplotlib v3.3.4

  • 更新 def scatter_logpolar_mpl 以使用 'symlog',因为使用 'log' 导致 posx 和 posy 应该是有限值,以及 'log-polar matplotlib' 的空图。
# 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()

enter image description here

原始答案

当前的 matplotlib 和对数极坐标图存在更多问题。

例如,尝试为 matplotlib example 中的半径添加一个小值对于极坐标图,然后使用 set_rlim(0)set_rscale('log') 绘制它(正如此处评论中所建议的那样)。所有低于 0.1 的值都会得到一些特殊处理。这会影响 r 轴上的刻度(注意完全错位的 10e-2 和 10e-3)以及绘制的数据:

Examples of polar and log-polar plots

该行为似乎没有记录。我最终手动进行了对数转换(上面系列中的第三个图)。对于遇到此线程的其他人,这是我的代码:

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

关于python - 如何在 matplotlib 中的极轴上使用对数刻度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14919407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com