Add points to the existing matplotlib scatter plot

toyewonug picture toyewonug · Dec 5, 2018 · Viewed 20.2k times · Source

How to add points to the existing diagram? The straightforward solution is to plot a new scatter, adding new data.

ax.scatter(data[:,0], data[:,1], cmap = cmap, c = color_data)
ax.scatter(new_points_x, new_points_y, color='blue')

But if we want to add more points with new colors, there is a problem: we have to take into consideration all previously added points.

It would be great if I could use a special function like

AddPoint(ax, new_point, color)

I want only add new points in new colors. I do NOT need any animations

Answer

Diziet Asahi picture Diziet Asahi · Dec 5, 2018

It's unclear why creating a second scatter, as suggested by @b-fg, is not acceptable, but you could write a function like so:

def addPoint(scat, new_point, c='k'):
    old_off = scat.get_offsets()
    new_off = np.concatenate([old_off,np.array(new_point, ndmin=2)])
    old_c = scat.get_facecolors()
    new_c = np.concatenate([old_c, np.array(matplotlib.colors.to_rgba(c), ndmin=2)])

    scat.set_offsets(new_off)
    scat.set_facecolors(new_c)

    scat.axes.figure.canvas.draw_idle()

which allows you to add a new point to an existing PathCollection.

example:

fig, ax = plt.subplots()
scat = ax.scatter([0,1,2],[3,4,5],cmap=matplotlib.cm.spring, c=[0,2,1])
fig.canvas.draw()  # if running all the code in the same cell, this is required for it to work, not sure why
addPoint(scat, [3,6], 'c')
addPoint(scat, [3.1,6.1], 'pink')
addPoint(scat, [3.2,6.2], 'r')
addPoint(scat, [3.3,6.3], 'xkcd:teal')
ax.set_xlim(-1,4)
ax.set_ylim(2,7)

enter image description here

Note that the function that I'm proposing is very basic and would need to be made much smarter depending on the use case. It is important to realize that the facecolors array in a PathCollection does not necessarily have the same number of elements as the number of points, so funny things can happen with colors if you try to add several points as once, or if the original points are all the same colors, etc...