Метки для нескольких наборов данных на одном графике с использованием mplcursors - PullRequest
1 голос
/ 12 октября 2019

У меня есть два набора данных, которые я строю на одном графике с помощью matplotlib. Я использую mplcursors, чтобы аннотировать каждую точку, используя массив меток. К сожалению, mplcursors использует первые пять меток для обоих наборов данных. Мой вопрос: как мне получить второй набор данных, который будет иметь свои собственные метки?

Я понимаю, что для этого простого примера я мог бы объединить данные, но я не могу для проекта, над которым я работаю.

import matplotlib.pyplot as plt
import mplcursors
import numpy as np

x = np.array([0, 1, 2, 3, 4])
y = np.array([1, 2, 3, 4, 5])
y2 = np.array([2, 3, 4, 5, 6])

fig, ax = plt.subplots()
ax.plot(x, y, "ro")
ax.plot(x, y2, 'bx')

labels = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]

mplcursors.cursor(ax, hover=True).connect(
    "add", lambda sel: sel.annotation.set_text(labels[sel.target.index]))
plt.show()

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Мой комментарий об использовании словаря будет выглядеть так:

import matplotlib.pyplot as plt
import mplcursors
import numpy as np

x = np.array([0, 1, 2, 3, 4])
y = np.array([1, 2, 3, 4, 5])
y2 = np.array([2, 3, 4, 5, 6])

fig, ax = plt.subplots()
line1, = ax.plot(x, y, "ro")
line2, = ax.plot(x, y2, 'bx')

labels1 = ["a", "b", "c", "d", "e"]
labels2 = ["f", "g", "h", "i", "j"]

d = dict(zip([line1, line2], [labels1, labels2]))

mplcursors.cursor(ax, hover=True).connect(
    "add", lambda sel: sel.annotation.set_text(d[sel.artist][sel.target.index]))

plt.show()
0 голосов
/ 12 октября 2019

Благодаря Эрнесту я смог получить грубый пример работы. Я установил метки для каждого графика на «один» и «два» соответственно. Затем, при наведении курсора на точку, сравните имя исполнителя с меткой, используя:

sel.artist.get_label ()

import matplotlib.pyplot as plt
import mplcursors
import numpy as np

x = np.array([0, 1, 2, 3, 4])
y = np.array([1, 2, 3, 4, 5])
y2 = np.array([2, 3, 4, 5, 6])

fig, ax = plt.subplots()
ax.plot(x, y, "ro", label="one")
ax.plot(x, y2, 'bx', label="two")

labels = ["a", "b", "c", "d", "e"]
labels2 = ["f", "g", "h", "i", "j"]

c1 = mplcursors.cursor(ax, hover=True)
@c1.connect("add")
def add(sel):
    if sel.artist.get_label() == "one":
        sel.annotation.set_text(labels[sel.target.index])
    elif sel.artist.get_label() == "two":
        sel.annotation.set_text(labels2[sel.target.index])

plt.show()
...