简体   繁体   中英

Matplotlib: updating multiple scatter plots in a loop

I have two data sets that I would like to produce scatterplots for, with different colors.

Following the advice in MatPlotLib: Multiple datasets on the same scatter plot

I managed to plot them. However, I would like to be able to update the scatter plots inside of a loop that will affect both sets of data. I looked at the matplotlib animation package but it doesn't seem to fit the bill.

I cannot get the plot to update from within a loop.

The structure of the code looks like this:

    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    for g in range(gen):
      # some simulation work that affects the data sets
      peng_x, peng_y, bear_x, bear_y = generate_plot(population)
      ax1.scatter(peng_x, peng_y, color = 'green')
      ax1.scatter(bear_x, bear_y, color = 'red')
      # this doesn't refresh the plots

Where generate_plot() extracts the relevant plotting information (x,y) coords from a numpy array with additional info and assigns them to the correct data set so they can be colored differently.

I've tried clearing and redrawing but I can't seem to get it to work.

Edit: Slight clarification. What I'm looking to do basically is to animate two scatter plots on the same plot.

Here's a code that might fit your description:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation


# Create new Figure and an Axes which fills it.
fig = plt.figure(figsize=(7, 7))
ax = fig.add_axes([0, 0, 1, 1], frameon=False)
ax.set_xlim(-1, 1), ax.set_xticks([])
ax.set_ylim(-1, 1), ax.set_yticks([])

# Create data
ndata = 50

data = np.zeros(ndata, dtype=[('peng', float, 2), ('bear',    float, 2)])

# Initialize the position of data
data['peng'] = np.random.randn(ndata, 2)
data['bear'] = np.random.randn(ndata, 2)

# Construct the scatter which we will update during animation
scat1 = ax.scatter(data['peng'][:, 0], data['peng'][:, 1], color='green')
scat2 = ax.scatter(data['bear'][:, 0], data['bear'][:, 1], color='red')


def update(frame_number):
    # insert results from generate_plot(population) here
    data['peng'] = np.random.randn(ndata, 2)
    data['bear'] = np.random.randn(ndata, 2)

    # Update the scatter collection with the new positions.
    scat1.set_offsets(data['peng'])
    scat2.set_offsets(data['bear'])


# Construct the animation, using the update function as the animation
# director.
animation = FuncAnimation(fig, update, interval=10)
plt.show()

You might also want to take a look at http://matplotlib.org/examples/animation/rain.html . You can learn more tweaks in animating a scatter plot there.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM