如何索引List / numpy数组以便用matplotlib绘制数据

时间:2015-06-20 14:22:46

标签: python numpy matplotlib

我有一个函数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绘制我的数据?

我的情节应如下所示:

plot

在我的情况下,aperature应该是宽度x,天空是我的时间t,而RMS是我的func(x,t)

1 个答案:

答案 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 =行继续。