Matplotlib - гистограмма и всплывающая подсказка - PullRequest
0 голосов
/ 11 июня 2018

Этот код возвращает всплывающую подсказку, когда мышь наводит курсор на гистограмму.Я хотел бы изменить код в случае гистограммы с накоплением и получить конкретную подсказку для раздела, когда мышь наводит курсор на участок гистограммы.Я не могу понять, как изменить formatter соответственно.

Вот иллюстрация того, чего я пытаюсь достичь.Если мышь наведет курсор на синюю часть третьего бара, всплывающая подсказка будет содержать информацию «ggg, hhh, iii», а если курсор мыши наведет курсор на зеленую часть третьего бара, подсказка будет содержать информацию «555, 666».

enter image description here

import numpy as np
import matplotlib.pyplot as plt
from mpldatacursor import datacursor

attendance = [['aaa', 'bbb', 'ccc'],
              ['ddd', 'eee', 'fff'],
              ['ggg', 'hhh', 'iii'],
              ['jjj', 'kkk', 'lll']]

attendance2 = [['111', '222'],
              ['333', '444'],
              ['555', '666'],
              ['777', '888']]

x = range(len(attendance))
y = [10, 20, 30, 40]
y2 = [5, 10, 15, 20]

fig, ax = plt.subplots()
ax.bar(x, y, align='center', bottom=0, color='lightblue')
ax.bar(x, y2, align='center', bottom=y, color='lightgreen')
ax.margins(0.05)
ax.set_ylim(bottom=0)

def formatter(**kwargs):
    dist = abs(np.array(x) - kwargs['x'])
    i = dist.argmin()
    return '\n'.join(attendance[i])

datacursor(hover=True, formatter=formatter)
plt.show()

1 Ответ

0 голосов
/ 11 июня 2018

kwargs для форматера mpldatacursor включает сведения о прямоугольном патче - в частности, bottom, left, height, width и т. Д. В этом случае нам просто нужно знатьгде нижняя часть прямоугольника - если это 0, мы можем использовать attendance для установки метки, в противном случае мы хотим использовать attendance2.

Итак, вы можете изменить свою функцию formatterдо:

def formatter(**kwargs):
    dist = abs(np.array(x) - kwargs['x'])
    i = dist.argmin()
    labels = attendance if kwargs['bottom'] == 0 else attendance2
    return '\n'.join(labels[i])

Что дает этот результат:

enter image description here

enter image description here

...