如何在Python中绘制给定函数的热图

2024-10-01 15:47:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为func(mu, gamma)的函数。对于mugamma的每个组合,函数都将返回一个值,我们将其称为return_value。在

现在我已经设置了mugamma的范围:

mu = np.linspace(0,1,100)
gamma = np.linspace(0,1,100)

现在我们有1e4个组合,每个组合对应一个return_value。我想画一张return_value的热图。在

我曾尝试在Python中使用pcolor。但是,从文档中的示例来看:

^{pr2}$

因为我的脚本中定义的函数fun不能将数组作为输入,所以它不起作用,如果我按照下面的示例操作,我会收到以下消息:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

下面是func的代码:

def fun(mu, gamma2):
    Isolation_Ratio = []
    kappa1 = gamma2
    kappa2 = gamma2                         
    gamma1 = gamma2
    g0 = gamma2 + kappa2 + gamma1 + kappa1
    gammag = kappa1/2. + gamma1/2.
    gamma = gamma2/2. + kappa2/2.
    for ii in range(len(rangedeltaw)):

        deltaw = rangedeltaw[ii]

        Forward_delta = forward_delta(mu, deltaw)
        Backward_delta = backward_delta(mu, deltaw)

        forward_root1, forward_root2, forward_root3 = forward_root(mu, deltaw)
        test_D, backward_root1, backward_root2, backward_root3 = backward_root(mu, deltaw)

        Root1.append(backward_root1)
        Root2.append(backward_root2)
        Root3.append(backward_root3)

        root1.append(forward_root1)
        root2.append(forward_root2)
        root3.append(forward_root3)
        if Forward_delta >= 0 and Backward_delta >= 0:
            a2sq = [max([forward_root1.real, forward_root2.real, forward_root3.real])]
            b1sq = [max([backward_root1.real, backward_root2.real, backward_root3.real])]
            A2sq.append(max([forward_root1.real, forward_root2.real, forward_root3.real]))
            B1sq.append(max([backward_root1.real, backward_root2.real, backward_root3.real]))
            for ii in range(len(a2sq)):
                for jj in range(len(b1sq)):

                    Isolation_Ratio.append(kappa2*a2sq[ii]/(kappa1*b1sq[jj]))
        elif Forward_delta >= 0 and Backward_delta < 0:
            a2sq = [max([forward_root1.real, forward_root2.real, forward_root3.real])]
            b1sq = [backward_root1.real]
            A2sq.append(max([forward_root1.real, forward_root2.real, forward_root3.real]))
            B1sq.append(backward_root1.real)
            for ii in range(len(a2sq)):
                for jj in range(len(b1sq)):
                    Isolation_Ratio.append(kappa2*a2sq[ii]/(kappa1*b1sq[jj]))

        elif Forward_delta < 0 and Backward_delta >= 0:
            a2sq = [forward_root1.real]
            b1sq = [max([backward_root1.real, backward_root2.real, backward_root3.real])]
            A2sq.append(forward_root1.real)
            B1sq.append(max([backward_root1.real, backward_root2.real, backward_root3.real]))
            for ii in range(len(a2sq)):
                for jj in range(len(b1sq)):
                    Isolation_Ratio.append(kappa2*a2sq[ii]/(kappa1*b1sq[jj]))

        else:   
            A2sq.append(forward_root1.real)
            B1sq.append(backward_root1.real)
            Isolation_Ratio.append(kappa2*forward_root1.real/(kappa1*backward_root1.real))   



    x = Isolation_RangeDeltaw
    y = Isolation_Ratio


    return max(y)

Tags: realmaxiiforwarddeltaappendmubackward
1条回答
网友
1楼 · 发布于 2024-10-01 15:47:59

所以,首先,如何获得热图。fun()仍然不是自包含的(forward_delta()等没有定义),所以我无法执行它,而且您没有指定错误发生在哪一行,但我可以猜测是违规者

if Forward_delta >= 0 and Backward_delta >= 0:

这意味着forward_delta()etc函数与数组一起工作。从外观上看,完全向量化函数是可能的,但这是一项非常重要的任务,而且是一个自身的问题(如果你问过这个问题,一定要确定一个self contained example)。一种更简单但效率较低的解决方案是按值填充热图:

^{pr2}$

第二个问题是,你现在的问题是如何安排。^{}用于可视化离散数组;^{}更适合您的用途:

fig = plt.figure()
s = fig.add_subplot(1, 1, 1, xlabel='$\\gamma$', ylabel='$\\mu$')
im = s.imshow(
    fun_map,
    extent=(gamma[0], gamma[-1], mu[0], mu[-1]),
    origin='lower')
fig.colorbar(im)
fig.savefig('t.png')

注意,在数组中,X维是最后一个(对应于gamma),但是imshow将X维放在第一位。在

一个简单函数的结果

def fun(mu, gamma):
    return numpy.sin(mu) + numpy.cos(gamma)

看起来像

{a4}

相关问题 更多 >

    热门问题