Skip to content Skip to sidebar Skip to footer

Matplotlib Animation With Trigger

Consider the matplotlib 3d plot animation given in this example link It animates 25 frames with a given interval of 50milliseconds. Is there anyway to control the moving on to the

Solution 1:

If you want to advance "by hand", remove the animation, and simply call the update() function from wherever you need.

You may or may not have to explicitly redraw the canvas depending on your backend, so I've added an explicit fig.canvas.draw_idle() to the update function.

Here is an example where the animation advances from a key press:

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as p3
import matplotlib.animation as animation

# Fixing random state for reproducibility
np.random.seed(19680801)


defGen_RandLine(length, dims=2):
    """
    Create a line using a random walk algorithm

    length is the number of points for the line.
    dims is the number of dimensions the line has.
    """
    lineData = np.empty((dims, length))
    lineData[:, 0] = np.random.rand(dims)
    for index inrange(1, length):
        # scaling the random numbers by 0.1 so# movement is small compared to position.# subtraction by 0.5 is to change the range to [-0.5, 0.5]# to allow a line to move backwards.
        step = ((np.random.rand(dims) - 0.5) * 0.1)
        lineData[:, index] = lineData[:, index - 1] + step

    return lineData


defupdate_lines(num, dataLines, lines):
    for line, data inzip(lines, dataLines):
        # NOTE: there is no .set_data() for 3 dim data...
        line.set_data(data[0:2, :num])
        line.set_3d_properties(data[2, :num])
    fig.canvas.draw_idle()
    return lines

# Attaching 3D axis to the figure
fig = plt.figure()
ax = p3.Axes3D(fig)

# Fifty lines of random 3-D lines
data = [Gen_RandLine(25, 3) for index inrange(50)]

# Creating fifty line objects.# NOTE: Can't pass empty arrays into 3d version of plot()
lines = [ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1])[0] for dat in data]

# Setting the axes properties
ax.set_xlim3d([0.0, 1.0])
ax.set_xlabel('X')

ax.set_ylim3d([0.0, 1.0])
ax.set_ylabel('Y')

ax.set_zlim3d([0.0, 1.0])
ax.set_zlabel('Z')

ax.set_title('3D Test')

num = 0defonkey(event):
    global num
    num += 1
    update_lines(num, data, lines)

cid = fig.canvas.mpl_connect('key_press_event', onkey)

plt.show()

Post a Comment for "Matplotlib Animation With Trigger"