从Python函数返回一个值并将其绘制在热图上

时间:2019-04-18 15:23:06

标签: python seaborn heatmap

我已使用以下代码为给定功能生成热图。在这里,它正在计算逻辑图的变化形式的全局lyapunov指数-我添加了p的参数。在这种情况下,我实际上并不在乎全局lyapunov指数的确切值是多少,而是确切的是正还是负。

这是我一直在使用的代码:

# Logistic Function
def p_logistic(A, x, p):
    return (A/4) * (((p+1)**(p+1))/(p**p)) * (x**p) * (1-x)

# Lyapunov Exponent
def p_lyap(A, x, p):
    return np.log(abs((A/4) * (((p+1)**(p+1))/(p**p)) * (p*(x**(p-1)) - (p+1)*(x**p))))

n = 500
A = np.linspace(2, 4, n)
p = np.linspace(0.5, 5, n)

def F(A, p):
    A, p = np.meshgrid(A, p)
    lyapunov = 0
    x = 0.9
    N = 100

    for i in range(0,N):
        lyapunov = lyapunov + p_lyap(A, x, p)
        x = p_logistic(A, x, p)

    global_lyapunov = lyapunov/N
    return global_lyapunov

z = F(A, p)
plt.figure(figsize=(8,8))
xlabels = ['{:3.1f}'.format(x) for x in A]
ylabels = ['{:3.1f}'.format(y) for y in p]
ax = sns.heatmap(z, xticklabels = A, yticklabels = p)

我尝试使用if语句返回大于0的全局lyapunov指数,如果小于0则返回-1,但返回错误

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

基本上,我只想在热图上使用3种颜色,一种是在全局lyapunov指数为负,等于0和正的情况下使用的。有什么可能吗?

2 个答案:

答案 0 :(得分:1)

假设我正确地解释了您的意思,我只会做类似的事情:

zd = np.zeros_like(z, dtype=int)
zd[z > 0] = 1
zd[z < 0] = -1

然后绘制zd而不是z

还请注意,直接从imshow使用matplotlib可能会更好,因为这样可以获得更好的轴标签,例如:

plt.figure(figsize=(8,8))
plt.imshow(zd, extent=(2, 4, 5, 0.5), aspect='auto')
plt.colorbar()

imshow不会像heatmap那样对值进行任何缩放,这可能对您的用例更好。

似乎还有很多未定义的值,因此可能值得对其进行特殊处理,例如:

zd[~np.isfinite(z)] = 0

给出以下内容的最终情节

implot

但是我不确定我是否正确地绕过轴

答案 1 :(得分:0)

numpy.sign是获取所需数据的简便方法。另外,似乎您打算使用xlabelylabel

sns.heatmap(np.sign(z), xticklabels=xlabel, yticklabels=ylabel)