我有一个函数f(x,t) = cos(t)*t + x
,我希望在离散的时间步长x
和离散的宽度步长上显示宽度t
和时间t_i
的结果更改x_j
。
现在我在SX工作了一段时间并感到非常尴尬,只能发布这样的小代码或换句话说什么都没有(因为我没有做过任何工作......): 然而,如果有人有时间提供帮助,我会很感激。
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as pyplot
from astropy.io.ascii.latex import AASTex
def func(xi, ti):
res = np.cos(ti)*ti + xi
return res
timeSpacing = 100
timeStart = 0
timeEnd = 1
time = np.linspace(timeStart, timeEnd, timeSpacing)
widthSpacing = 300
widthStart = 0
widthEnd = 3
width = np.linspace(widthStart, widthEnd, widthSpacing)
resultList = [None]*timeSpacing
resultListInner = [None]*widthSpacing
for i, ithTime in enumerate(time):
for j, jthWidth in enumerate(width):
aas = np.zeros_like(width)
aas.fill(ithTime)
resultListInner[j] = ithTime, jthWidth, func(jthWidth, aas)
resultList[i] = resultListInner
那么如何正确索引列表和数组并使用matplotlib绘制我的数据?
我的情节应如下所示:
在我的情况下,aperature应该是宽度x
,天空是我的时间t
,而RMS是我的func(x,t)
。
答案 0 :(得分:1)
有几点:
Numpy为数组元素的差异提供了一个非常好的函数:diff
Matplotlib使用plot_wireframe
创建您想要的地块(也使用Numpy的meshgrid
)
现在,将这些结合到您可能想要的内容中会看起来像这样。
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
def func(xi, ti):
res = np.cos(ti)*np.sin(xi)
return res
timeSpacing = 20
timeStart = 0
timeEnd = 1
time = np.linspace(timeStart, timeEnd, timeSpacing)
widthSpacing = 50
widthStart = 0
widthEnd = 3
width = np.linspace(widthStart, widthEnd, widthSpacing)
X,T = np.meshgrid(width,time)
F = func(X,T)
DF = np.diff(np.diff(F,axis=0),axis=1)
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.plot_wireframe(X[:-1,:-1],T[:-1,:-1],DF)
plt.show()
请注意,diff
会被应用两次:每个维度axis=
一次。我还将你提供的玩具功能改为在这种情况下实际看起来不错的东西。
为了更广泛的使用,您似乎只想将所有F
数据收集到2D数组中,然后从DF =
行继续。