Here’s something I came up with using Makie:
using CairoMakie
xi = -15:0.1:15
t = 0:30
u1data = [exp(-(x-0.5*(t-15))^2) for x in xi, t in t]
fig = Figure()
ax = Axis3(fig[1,1];
azimuth=-1.46, elevation=1,
xticks=-15:5:15, zticks=0:2,
limits=(nothing, nothing, (0,2)),
xgridvisible=false, ygridvisible=false, zgridvisible=false,
(Symbol.([:x, :y, :z], "spinecolor_", [2 3]) .=> :transparent)...,
xlabel=L"\xi", ylabel=L"t", zlabel=L"|u|")
for (tval, z) in Iterators.reverse(zip(t, eachcol(u1data)))
tvals = fill(tval, length(xi))
band!(Point3.(xi, tvals, 0), Point3.(xi, tvals, z), color=:white)
lines!(xi, tvals, z, color=:black)
end
fig
(Use GLMakie or WGLMakie instead of CairoMakie for interactivity.)
With Makie you can do surface(xi, t, u1data) where xi and t are vectors and u1data is a matrix.
