繁体   English   中英

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 坐标计算 az 值。 然后我想将这些值组合在一起以获得 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') 将数组的 [0, 0] 索引放在 Axes 的左上角或左下角. 约定(默认)'upper' 通常用于矩阵和图像。

请注意,垂直轴向上指向“下”,而“上”指向下。

有关示例和更详细的描述,请参阅 imshow 教程中的来源和范围。

尝试修改为:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM