用meshgrid和imshow绘图

Cok*_*kes 3 numpy matplotlib

Imshow和meshgrid不按我想象的方式工作.我为2D中的给定(x,y)点定义了一些函数,它返回标量f(x,y).我想使用imshow可视化函数f.

x = np.linspace(0,4)
y = np.linspace(0,1)

X,Y = np.meshgrid(x,y)
Z = np.zeros((50,50))

for i in range(50):
   for j in range(50):
       Z[i,j] = f(X[i,j],Y[i,j])

fig = plt.figure()
plt.imshow(Z,extent=[0,4,1,0])
plt.show()
Run Code Online (Sandbox Code Playgroud)

除了在我认为它应该是[0,4,0,1]的程度之外,这可以正常工作......我是否错误地为每个(x,y)对定义了Z [i,j]?解释这是如何工作将是伟大的!谢谢!

Gre*_*reg 11

据我所知,imshow通常用于显示图像.然后使用范围来定义它应该有多大,比如你可能想要将图像作为图的背景.

相反,我认为你会发现它更直观pcolor,可以在这里找到一个演示.它的工作方式与imshow您可以提供的相同Z.但是,你也可以给它XY数组.这样你就可以真正检查你是否正确提供了值:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,4)
y = np.linspace(0,1)

def f(x, y):
    return y * np.sin(x) 

X, Y = np.meshgrid(x,y)
Z = np.zeros((50,50))

for i in range(50):
   for j in range(50):
       Z[i,j] = f(X[i,j],Y[i,j])

plt.pcolor(X, Y, Z)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我添加了一个函数来显示它的工作原理.请注意,如果您的函数能够处理numpy数组,您可以用Z和替换嵌套for循环的初始化

X, Y = np.meshgrid(x,y)
Z = f(X, Y)
Run Code Online (Sandbox Code Playgroud)

这更清洁,计算速度更快.

  • 对于大型数组,`pcolor`变慢...如果你的数组很大且规则,请考虑`pcolormesh`. (2认同)