Python:创建 X、Y 坐标网格和相应的计算 Z 值以生成 XYZ 的 3D 数组

Python: Creating a Grid of X,Y coordinates and corresponding calculated Z values to result in a 3D array of XYZ

我有一个函数可以根据给定的 x 和 y 坐标计算 z 值。然后我想将这些值组合在一起以获得 x、y、z 的 3D 数组。我正在尝试使用以下代码执行此操作:

#import packages

import pandas as pd
import math
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.tri as tri
import matplotlib.pyplot as plt
from matplotlib import rcParams
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable
from mpl_toolkits.mplot3d import Axes3D

#Define function to calculate z over a grid
def func(X, Y, x, y, Q):
    return (Q / (2 * np.pi)) * np.arctan((y-Y)/(x-X))

#For initial testing just defining the IW explicitly, last step will be to read the input file and pull this data
X1=2417743.658
Y1=806346.704
Q1=5
X2=2417690.718
Y2=806343.693
Q2=5
X3=2417715.221
Y3=806309.685
Q3=5

#initiate the XY grid
xi = np.linspace(2417675,2417800,625)
yi = np.linspace(806300,806375,375)

#mesh the grid in to x,y space
x,y = np.meshgrid(xi,yi)

#calculate the values over the grid at every x,y using the defined function above
zi = (func(X1,Y1,x,y,Q1)+func(X2,Y2,x,y,Q2)+func(X3,Y3,x,y,Q3))

#reshape the xy space into 3d space - when i plot this grid it looks correct
xy = np.array([[(x, y) for x in xi] for y in yi])

#reshape z into 3d space -  this appears to be where the issue begins
z = np.array(zi).reshape(xy.shape[0],xy.shape[1], -1)

#combined xyz into a single grid
xyz = np.concatenate((xy, z), axis = -1)

# Create figure and add axis
fig = plt.figure(figsize=(4,4))
ax = fig.add_subplot(111)

img = ax.imshow((xyz*255).astype(np.uint8))

输出:

我确实得到了一个 XYZ 数组,当我打印它时,值似乎映射正确,但是当我绘制数据时,它显示的 y 值基本上是“颠倒的”。这是输出应该看起来的样子,但在 x 轴上“翻转”了。此外,轴显示节点编号而不是 X、Y 值。我希望 0,0 点像笛卡尔坐标一样位于左下角,并且每个 x,y 都有一个对应的 z,它是根据给定的 x,y 计算得出的。我知道必须有一种更简单的方法来解决这个问题。有谁知道更好的方法?或者我在这里做错了什么?

谢谢

ax.imshow() 有一个选项允许指定原点。

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html

origin{'upper', 'lower'}, default: rcParams["image.origin"] (default: 'upper') Place the [0, 0] index of the array in the upper left or lower left corner of the Axes. The convention (the default) 'upper' is typically used for matrices and images.

Note that the vertical axis points upward for 'lower' but downward for 'upper'.

See the origin and extent in imshow tutorial for examples and a more detailed description.

尝试修改为:

img = ax.imshow((xyz*255).astype(np.uint8), origin='lower')

对于轴标签,可以使用以下命令更改它们

ax.set_xticks(LIST_OF_INDICIES)
ax.set_xticklabels(LIST_OF_VALUES)