Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用matplotlib,如何创建具有极轴投影和符号r轴的二维直方图?_Python_Matplotlib_Plot_Polar Coordinates - Fatal编程技术网

Python 使用matplotlib,如何创建具有极轴投影和符号r轴的二维直方图?

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

我在创建带有符号轴的极直方图时遇到了问题。然而,只有当r值为负值时,这才会中断。我能做些什么来解决这个问题

我已经包括了一个显示5个图的最小示例。图4是不起作用的(中间一行右侧)。图5是显示它与正数一起工作

以下是输出:

代码如下:

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报告(虽然这可能与我链接到的一些问题重叠)。你有没有时间来看看我的答案?