为什么contourf(matplotlib)会切换x和y坐标?

时间:2017-03-31 07:54:54

标签: python-3.x matplotlib

我试图让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)")

抛出的数字是这样的: enter image description here

在等高线上,在x方向上具有较大的宽度(不是y)。下面是显示的切片,一个横跨x方向(恒定y = 0,蓝色),另一个沿y方向(常数x = 0,红色)。在这里,一切看起来都很好,y方向比x方向更宽。那么为什么我必须转换数组才能按照我想要的方式绘制它?这对我来说似乎不直观,也不符合文档。

1 个答案:

答案 0 :(得分:1)

如果您认为2D数组的形状不是(x,y)而是(行,列),这会有所帮助,因为这是大多数数学例程解释它们的方式 - 包括matplotlib的2D绘图功能。因此,第一个维度是垂直的(你称之为y),第二个维度是水平的(你称之为x)。

请注意,这种惯例非常突出,即使在numpy中也是如此。函数np.vstack应该连接数组 v 在第一维上工作,np.hstack在第二维上工作 h orizo​​ntally。

说明要点:

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]]

并一致地绘制

enter image description here

根据你的约定,数组是(x,y),命令a[:, 2] = 2应该分配给第三行,但是numpy和matplotlib都同意它是列:)

您当然可以使用自己的约定如何解释数组的维度,但从长远来看,将它们视为(y,x)会更加一致。