使用matplotlib.contour处理复杂数据

0 投票
1 回答
2859 浏览
提问于 2025-04-16 14:22

我正在尝试使用matplotlib从一个复杂的数组中显示等高线图。这个数组是一个2x2的复杂矩阵,是通过类似C语言的方法生成的:

 for i in max_y:
   for j in max_x:
      pos_x = pos_x + step
      z = complex(pos_x,pos_y)
        c_arr[i][j] = complex_function(z)
   pos_y = pos_y + step

我想用等高线图来绘制这个c_arr(只取实部),但到目前为止,我从等高线图中得到的结果只有

TypeError: Input z must be a 2D array.

c_arr.real 一个二维数组,不管我用x、y,还是pos_x、pos_y来创建网格,结果总是一样。matplotlib的文档告诉我怎么使用它,但没有说明需要什么数据类型,所以我感觉很困惑。

编辑:感谢你的回答。现在我的问题是,我必须从一个函数中获取复杂值,形式如下:

 def f(z):
      return np.sum(np.arange(n)*np.sqrt(z-1)**np.arange(n))

其中的和必须加起来。如何才能使用等高线图需要的meshgrid形式来实现呢?再次感谢。

1 个回答

3

matplotlib.pyplot.contour() 这个函数可以处理复杂的数值输入数组。它会自动从数组中提取出实数值:

#!/usr/bin/env python
import numpy as np
from matplotlib import pyplot as plt

# generate data
x = np.r_[0:100:30j]
y = np.r_[0:1:20j]
X, Y = np.meshgrid(x, y)
Z = X*np.exp(1j*Y) # some arbitrary complex data

# plot it
def plotit(z, title):
    plt.figure()
    cs = plt.contour(X,Y,z) # contour() accepts complex values
    plt.clabel(cs, inline=1, fontsize=10) # add labels to contours
    plt.title(title)
    plt.savefig(title+'.png')

plotit(Z, 'real')
plotit(Z.real, 'explicit real')
plotit(Z.imag, 'imagenary')

plt.show()

实数

real

明确的实数

explicit real

虚数

imagenary

撰写回答