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