我有一個函式可以根據給定的 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 計算出來的。我知道必須有更簡單的方法來解決這個問題。有人知道更好的方法嗎?或者我在這里做錯了什么?
謝謝
uj5u.com熱心網友回復:
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/337703.html
標籤:Python 数组 麻木的 matplotlib xyz
