Разброс имеет только один цвет для всех точек.Таким образом, вы не можете изменить 5-ю строку массива, который имеет только одну строку.Итак, сначала вы должны убедиться, что все цвета лица установлены индивидуально с помощью аргумента facecolors.Затем вы можете получить их в формате массива, и после щелчка предоставить копию исходного массива с соответствующим элементом, измененным на разброс.
2D
import numpy as np
import matplotlib.pyplot as plt
X_t = np.random.rand(10,4)*20
fig, ax1 = plt.subplots()
points = ax1.scatter(X_t[:,0], X_t[:,1],
facecolors=["C0"]*len(X_t), edgecolors=["C0"]*len(X_t), picker=True)
fc = points.get_facecolors()
def plot_curves(indexes):
for i in indexes: # might be more than one point if ambiguous click
new_fc = fc.copy()
new_fc[i,:] = (1, 0, 0, 1)
points.set_facecolors(new_fc)
points.set_edgecolors(new_fc)
fig.canvas.draw_idle()
def onpick(event):
ind = event.ind
plot_curves(list(ind))
fig.canvas.mpl_connect('pick_event', onpick)
plt.show()
3D
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
X_t = np.random.rand(10,4)*20
fig, ax1 = plt.subplots(subplot_kw=dict(projection="3d"))
points = ax1.scatter(X_t[:,0], X_t[:,1], X_t[:,2],
facecolors=["C5"]*len(X_t), edgecolors=["C5"]*len(X_t), picker=True)
fc = points.get_facecolors()
def plot_curves(indexes):
for i in indexes: # might be more than one point if ambiguous click
new_fc = fc.copy()
new_fc[i,:] = (1, 0, 0, 1)
points._facecolor3d = new_fc
points._edgecolor3d = new_fc
fig.canvas.draw_idle()
def onpick(event):
ind = event.ind
plot_curves(list(ind))
fig.canvas.mpl_connect('pick_event', onpick)
plt.show()