Измените цвет выбранной точки данных внутри подплота одним щелчком мыши. - PullRequest
2 голосов
/ 08 января 2020

Переполнение стека Good Day,

Я относительный python новичок, и я застрял со следующей задачей: я хотел бы изменить цвет точки данных, нажав на саму точку. Я зашел относительно далеко, создав случайные субплоты, но я могу изменить цвет точек только в последнем субплоте (щелчок в другом месте также изменит цвет только в последнем графике). Что мне не хватает?

import numpy as np
import matplotlib.pyplot as plt
import random
import sys


fig, axes = plt.subplots(nrows=5, ncols=3, sharex=True, sharey=True)
xlim = (0, 30)
ylim = (0, 15)
plt.xticks(np.arange(0, 15, 5))
plt.yticks(np.arange(0, 15, 5))
plt.xticks(np.arange(0, 30, 5))
plt.setp(axes, xlim=xlim, ylim=ylim)

for i in range(0, 5, 1):
    for j in range(0, 3, 1):
        X_t = np.random.rand(10, 4) * 20
        points = axes[i][j].scatter(X_t[:, 0], X_t[:, 1],
                                    facecolors=["C0"] * len(X_t), edgecolors=["C0"] * len(X_t), picker=True)


def onpick(event):
    print(X_t[event.ind], "clicked")
    points._facecolors[event.ind, :] = (1, 1, 0, 1)
    points._edgecolors[event.ind, :] = (1, 0, 0, 1)
    fig.canvas.draw()


fig.canvas.mpl_connect('pick_event', onpick)


plt.show()

Кажется, что информация, включенная в event.ind, неверна, и я запрашиваю эту информацию в неправильный момент.

Я рад любой помощи!

Привет!

(Редактирование рекомендуемой наилучшей практики)

1 Ответ

1 голос
/ 08 января 2020

Вам необходимо сохранить все баллы для ваших разных участков и проверить с помощью event.artist, на каком участке вы нажимаете в данный момент ( См. Этот вопрос )

import numpy as np
import matplotlib.pyplot as plt


fig, axes = plt.subplots(nrows=5, ncols=3, sharex=True, sharey=True)
xlim = (0, 30)
ylim = (0, 15)
plt.xticks(np.arange(0, 15, 5))
plt.yticks(np.arange(0, 15, 5))
plt.xticks(np.arange(0, 30, 5))
plt.setp(axes, xlim=xlim, ylim=ylim)

points_list = []   ###
for i in range(0, 5, 1):
    for j in range(0, 3, 1):
        X_t = np.random.rand(10, 4) * 20
        points_list.append(axes[i][j].scatter(X_t[:, 0], X_t[:, 1],
                                              facecolors=["C0"] * len(X_t), edgecolors=["C0"] * len(X_t), picker=True))   ###


def onpick(event):
    print(event.artist, X_t[event.ind], "clicked")
    for points in points_list:
        if event.artist == points:  ###
            points._facecolors[event.ind, :] = (1, 1, 0, 1)
            points._edgecolors[event.ind, :] = (1, 0, 0, 1)

    fig.canvas.draw()


fig.canvas.mpl_connect('pick_event', onpick)
plt.show()

Из чека event.artist == points вы видите, вы можете использовать event.artist напрямую вместо сохранения всех точек в списке:

def onpick(event):
    print(event.artist, X_t[event.ind], "clicked")
    event.artist._facecolors[event.ind, :] = (1, 1, 0, 1)
    event.artist._edgecolors[event.ind, :] = (1, 0, 0, 1)
    fig.canvas.draw()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...