从 Python 中的函数返回一个值并将其绘制在热图上
Returning one value from function in Python and plotting it on a 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 语句 return 全局 lyapunov 指数,如果它大于 0,则为 1,如果小于 0,则为 -1,但它 returned 错误
The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
基本上我只想要我的热图中的 3 种颜色,一种用于当全局 lyapunov 指数为负、等于 0 和正时。有什么办法可以做到吗?
假设我对你的解释正确,我会做类似的事情:
zd = np.zeros_like(z, dtype=int)
zd[z > 0] = 1
zd[z < 0] = -1
然后绘制 zd
而不是 z
另请注意,您最好直接从 matplotlib
使用 imshow
,这样您可以获得更好的轴标签,例如:
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
给出最终情节:
但我不确定我的坐标轴是否正确
numpy.sign
是获取所需数据的简单方法。另外,您似乎打算使用 xlabel
和 ylabel
:
sns.heatmap(np.sign(z), xticklabels=xlabel, yticklabels=ylabel)
我使用以下代码为给定函数生成热图。这里是计算逻辑映射变化的全局 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 语句 return 全局 lyapunov 指数,如果它大于 0,则为 1,如果小于 0,则为 -1,但它 returned 错误
The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
基本上我只想要我的热图中的 3 种颜色,一种用于当全局 lyapunov 指数为负、等于 0 和正时。有什么办法可以做到吗?
假设我对你的解释正确,我会做类似的事情:
zd = np.zeros_like(z, dtype=int)
zd[z > 0] = 1
zd[z < 0] = -1
然后绘制 zd
而不是 z
另请注意,您最好直接从 matplotlib
使用 imshow
,这样您可以获得更好的轴标签,例如:
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
给出最终情节:
但我不确定我的坐标轴是否正确
numpy.sign
是获取所需数据的简单方法。另外,您似乎打算使用 xlabel
和 ylabel
:
sns.heatmap(np.sign(z), xticklabels=xlabel, yticklabels=ylabel)