0

我有一个函数可以根据给定的 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 计算的。我知道必须有一个更简单的方法来解决这个问题。有谁知道更好的方法?或者我在这里做错了什么?

谢谢

4

1 回答 1

0

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的左上角或左下角. 约定(默认)“上”通常用于矩阵和图像。

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

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

尝试修改为:

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

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

ax.set_xticks(LIST_OF_INDICIES)
ax.set_xticklabels(LIST_OF_VALUES)
于 2021-10-26T12:04:45.233 回答