matplotlib 如何使用pyplot.imshow为分段函数绘制等值线

xu3bshqb  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(87)

函数是z = (x - 1) **10 + 5*(x - 1)**5*(y - 1)**5 + (y - 1)**10。但由于正值较大,等值线不能清晰地显示负值。
所以我只需要用对数表示正值(如果z < 0,则为np.log(1 + 0)),但保留负值作为原点。
我怎么能用pyplot.imshow做到这一点?
此代码不起作用:

import numpy as np
import matplotlib.pyplot as plt

def z(x, y):
    z0 = (x - 1) **10 + 5*(x - 1)**5*(y - 1)**5 + (y - 1)**10
    # ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    return z0 if z0 < 0 else np.log(1 + z0)

def main():
    x, y = np.linspace(0.0, 3.0, 300), np.linspace(0.0, 3.0, 300)
    X, Y = np.meshgrid(x, y)
    plt.imshow(z(X, Y), origin='lower', extent = [0, 3, 0, 3], cmap=plt.cm.hsv)
    plt.colorbar()
    plt.show()

if __name__ == '__main__':
    main()

字符串

kt06eoxx

kt06eoxx1#

问题出在代码行中:

return z0 if z0 < 0 else np.log(1 + z0)

字符串
这一行引发ValueError,因为您正在比较数组和标量。当使用NumPy数组时,我建议使用切片器:

def z(x, y):
    z0 = (x - 1) **10 + 5*(x - 1)**5*(y - 1)**5 + (y - 1)**10
    z0[z0 >= 0] = np.log(1 + z0[z0 >= 0])
    return z0


切片器允许您仅更改数组中所需的元素。

相关问题