Python 使用matplotlib,如何创建具有极轴投影和符号r轴的二维直方图?
我在创建带有符号轴的极直方图时遇到了问题。然而,只有当r值为负值时,这才会中断。我能做些什么来解决这个问题 我已经包括了一个显示5个图的最小示例。图4是不起作用的(中间一行右侧)。图5是显示它与正数一起工作 以下是输出: 代码如下:Python 使用matplotlib,如何创建具有极轴投影和符号r轴的二维直方图?,python,matplotlib,plot,polar-coordinates,Python,Matplotlib,Plot,Polar Coordinates,我在创建带有符号轴的极直方图时遇到了问题。然而,只有当r值为负值时,这才会中断。我能做些什么来解决这个问题 我已经包括了一个显示5个图的最小示例。图4是不起作用的(中间一行右侧)。图5是显示它与正数一起工作 以下是输出: 代码如下: import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from matplotlib.scale import SymmetricalLogTransform
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.scale import SymmetricalLogTransform
MIN_BINS = 500
MAX_BINS = 1000
# utility function for making bins of correct size
def get_bins(min_val, max_val, scaling):
w = 1 + max(MIN_BINS, min(MAX_BINS, abs(min_val - max_val) + 1))
if scaling == 'log':
return np.logspace(np.log10(min_val), np.log10(max_val), w)
elif scaling == 'symlog':
tr = SymmetricalLogTransform(base=10, linthresh=1, linscale=1)
ss = tr.transform([min_val, max_val])
ls = tr.inverted().transform(np.linspace(*ss, num=w))
return ls
else:# linear
return np.linspace(min_val, max_val, w)
TESTS = [1,2,3,4,5]
plt.figure(figsize=(12,18))
plot_pos = 320
for TEST in TESTS:
plot_pos += 1
if TEST == 1:
NEG = True
YSCALE = 'linear'
PROJECTION = None
if TEST == 2:
NEG = True
YSCALE = 'symlog'
PROJECTION = None
if TEST == 3:
NEG = True
YSCALE = 'linear'
PROJECTION = 'polar'
# This is what I want to work
if TEST == 4:
NEG = True
YSCALE = 'symlog'
PROJECTION = 'polar'
# However, remove the negative numbers and it seems to work
if TEST == 5:
NEG = False
YSCALE = 'symlog'
PROJECTION = 'polar'
sample_size = 100000
xs = np.pi * np.linspace(0.0, 2.0, sample_size)
ys = 20 * np.random.random(sample_size)
if NEG:
ys -= 10
ax = plt.subplot(plot_pos, projection=PROJECTION)
ax.set_title('Neg/Scale/Proj.:%s,%s,%s' % (NEG, YSCALE, PROJECTION))
min_y = np.min(ys)
max_y = np.max(ys)
min_x = np.min(xs)
max_x = np.max(xs)
x_bins = get_bins(min_x, max_x, 'linear')
y_bins = get_bins(min_y, max_y, YSCALE)
hist, xedges, yedges = np.histogram2d(
xs,
ys,
bins=[x_bins, y_bins]
)
X, Y = np.meshgrid(xedges, yedges)
ax.pcolormesh(
X, Y,
hist.T,
cmap=cm.gray_r,
)
if PROJECTION == 'polar':
ax.set_rscale(YSCALE)
ax.set_rmax(max_y)
ax.set_rmin(min_y)
else:
ax.set_ylim([min_y, max_y])
ax.set_yscale(YSCALE)
ax.grid(True)
plt.savefig('polar_example.png')
这可能是matplotlib中的一个错误,不幸的是极坐标图有多个和 我怀疑问题在于,对于有问题的第四个
polar
-symlog
轴:
>>> ax.get_rmin()
-9.9998049982336408
>>> ax.get_rmax()
9.9999564676741315
负半径存在,因为symlog
准备处理它们。但是,matplotlib在绘制这些值时遇到了一些问题,以及。我认为现在唯一的问题是调用ax.set_rmin()
期间传入的负径向限制被解释为反映的正值。这是你的测试,当我把放射状外壳改成
if PROJECTION == 'polar':
ax.set_rscale(YSCALE)
ax.set_rmax(max_y)
ax.set_rmin(max(0,min_y)) # change here
对于任何想知道什么是“符号”刻度的人来说,有关于对称对数刻度的详细信息。它们非常有用。是的,对不起,我在留下评论后意识到:)结果是凌晨2点之后,一个人不应该是个聪明的混蛋……我只是没有足够快地删除我的评论;)对不起。@AndrasDeak没问题:)它们并不常见,我最近才知道。我加了两分钱作为忏悔,但你应该检查结果是否真的是你所期望的。如果是,你应该考虑提交GITHUB上的bug报告(虽然这可能与我链接到的一些问题重叠)。你有没有时间来看看我的答案?