Как изменить цвет набора точек в матплоте при нажатии на легенды? - PullRequest
2 голосов
/ 27 июня 2019

Может кто-нибудь помочь, как изменить цвет набора точек в pyplot, когда я нажимаю на ярлыки легенды?

Ниже приведен код, в котором есть два набора точек x1 и x2.Я строю их как точечный график.Он отображает все точки в наборе x1 и x2 синим цветом.Есть ли способ изменить цвет точек в наборе x1 на красный, когда я нажимаю на метку легенды x1

import matplotlib.pyplot as plot
x1 = [1,3,5,7,9]
x2 = [2,4,6,8,10]
fig, ax = plot.subplots()
ax.scatter(x1,x1,color = 'b',s = 50,label = 'x1')
ax.scatter(x2,x2,color = 'b',s = 50,label = 'x2')
ax.legend(loc = 'upper left')
plot.show()

1 Ответ

1 голос
/ 27 июня 2019

В документации по matplotlib есть пример выбора легенды .Мы можем адаптировать его к случаю, когда сбор происходит по точечной диаграмме, и цвет должен измениться.

С этой целью мы создаем сборщик на легендарном исполнителе (прокси) и прикрепляем атрибут toggled к значениюзнать, в каком из двух состояний находится художник (это проще, чем использовать get_color из-за преобразования цветов в кортежи RGB внутри).

import matplotlib.pyplot as plt


x1 = [1,3,5,7,9]
x2 = [2,4,6,8,10]
fig, ax = plt.subplots()
line1 = ax.scatter(x1,x1,color = 'b',s = 50,label = 'x1')
line2 = ax.scatter(x2,x2,color = 'b',s = 50,label = 'x2')
leg = ax.legend(loc = 'upper left')

# we will set up a dict mapping legend line to orig line, and enable
# picking on the legend line
lines = [line1, line2]
lined = dict()
for legline, origline in zip(leg.legendHandles, lines):
    legline.set_picker(5)  # 5 pts tolerance
    legline.toggled = False  # create custom attribute to observe state
    lined[legline] = origline

def onpick(event):
    legline = event.artist
    origline = lined[legline]

    c = "b" if legline.toggled else "r"
    legline.set_color(c)
    origline.set_color(c)

    fig.canvas.draw_idle()

    legline.toggled = not legline.toggled


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

plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...