How to index List/ numpy array in order to plot the data with matplotlib

Question:

I have a function f(x,t) = cos(t)*t + x and i want to display the change of the result over the width x and time t at discretised time steps t_i and discretised width steps x_j.

Now I am a while here on SX and feel really embarrassed to only can post such little code or in other words nothing (since nothing worked I have done…):
Nevertheless if someone has the time to help, I`d appreciate it.

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

So how do I correctly index the list and array and plot my data using matplotlib?


My plot should look like this:

plot

where in my case the aperature should be the width x, the sky annulus is my time t and the RMS is my func(x,t).

Asked By: user69453

||

Answers:

A couple of points:

  • Numpy provides a very nice function for doing differences of array elements: diff

  • Matplotlib uses plot_wireframe for creating a plot that you would want (also using Numpy’s meshgrid)

Now, combining these into what you may want would look something like this.

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()

Note that diff is applied twice: once in each dimension axis= . I have also changed the toy function you provided to something that actually looks decent in this case.

For your more general use, it seems that you would want to just collect all of your F data into a 2D array, then proceed from the DF = line.

Answered By: KevinG
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.