我试图让contourf正确地绘制我的东西,但它似乎切换了x和y坐标。在下面的例子中,我通过评估在x和y方向上具有不同宽度的2d高斯函数来证明这一点。给定值,y方向的宽度应该更大。这是脚本:
from numpy import *
from matplotlib.pyplot import *
xMax = 50
xNum = 100
w0x = 10
w0y = 15
dx = xMax/xNum
xGrid = linspace(-xMax/2+dx/2, xMax/2-dx/2, xNum, endpoint=True)
yGrid = xGrid
Int = zeros((xNum, xNum))
for idX in range(xNum):
for idY in range(xNum):
Int[idX, idY] = exp(-((xGrid[idX]/w0x)**2 + (yGrid[idY]/(w0y))**2))
fig = figure(6)
clf()
ax = subplot(2,1,1)
X, Y = meshgrid(xGrid, yGrid)
contour(X, Y, Int, colors='k')
plot(array([-xMax, xMax])/2, array([0, 0]), '-b')
plot(array([0, 0]), array([-xMax, xMax])/2, '-r')
ax.set_aspect('equal')
xlabel("x")
ylabel("y")
subplot(2,1,2)
plot(xGrid, Int[:, int(xNum/2)], '-b', label='I(x, y=max/2)')
plot(xGrid, Int[int(xNum/2), :], '-r', label='I(x=max/2, y)')
ax.set_aspect('equal')
legend()
xlabel(r"x or y")
ylabel(r"I(x or y)")
在等高线上,在x方向上具有较大的宽度(不是y)。下面是显示的切片,一个横跨x方向(恒定y = 0,蓝色),另一个沿y方向(常数x = 0,红色)。在这里,一切看起来都很好,y方向比x方向更宽。那么为什么我必须转换数组才能按照我想要的方式绘制它?这对我来说似乎不直观,也不符合文档。
答案 0 :(得分:1)
如果您认为2D数组的形状不是(x,y)而是(行,列),这会有所帮助,因为这是大多数数学例程解释它们的方式 - 包括matplotlib的2D绘图功能。因此,第一个维度是垂直的(你称之为y),第二个维度是水平的(你称之为x)。
请注意,这种惯例非常突出,即使在numpy中也是如此。函数np.vstack
应该连接数组 v 在第一维上工作,np.hstack
在第二维上工作 h orizontally。
说明要点:
import numpy as np
import matplotlib.pyplot as plt
a = np.array([[0, 0, 1, 0, 0],
[0, 1, 1, 1, 0],
[1, 1, 1, 1, 1]])
a[:, 2] = 2 # set column
print(a)
plt.imshow(a)
plt.contour(a, colors='k')
打印
[[0 0 2 0 0]
[0 1 2 1 0]
[1 1 2 1 1]]
并一致地绘制
根据你的约定,数组是(x,y),命令a[:, 2] = 2
应该分配给第三行,但是numpy和matplotlib都同意它是列:)
您当然可以使用自己的约定如何解释数组的维度,但从长远来看,将它们视为(y,x)会更加一致。