当我将鼠标移动到绘图中的标记时,如何在弹出框中显示绘图数据

时间:2017-02-09 05:42:32

标签: python python-3.x matplotlib

我有以下代码行来生成如下所示的图。

from matplotlib import pyplot as plt
from mpldatacursor import datacursor
from matplotlib import dates as mdates
import datetime

date = [datetime.date(2015, 7, 1), datetime.date(2015, 8, 1), datetime.date(2015, 9, 1), datetime.date(2015, 10, 1), datetime.date(2015, 11, 1), datetime.date(2015, 12, 1), datetime.date(2016, 1, 1), datetime.date(2016, 2, 1)]
people = [0, 0, 0, 0, 0, 0, 122, 38]

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
lns1 = ax1.plot(date, people, 'ro')
plt.gcf().autofmt_xdate()

datacursor(ax1, hover=True, formatter='customer: {y:0.0f}'.format)
plt.show()

输出: enter image description here

我想要做的是,当我将鼠标悬停在标记上时显示弹出框。但是随着我的代码,无论我移动光标,我都会弹出。

还可以在弹出窗口中显示日期吗?

1 个答案:

答案 0 :(得分:1)

问题在于,您已将datacursor附加到axes对象而非绘图本身,因此当您将鼠标移动到轴内的任何位置时,它将被触发。如果您将其附加到绘图中,则只有在您对数据点进行处理时才会触发。

datacursor(lns1, hover=True, formatter='customer: {y:0.0f}'.format)

如果要在光标中显示日期,可以从xaxis获取主刻度格式化程序,并将其用作数据光标的格式化程序

# Get the formatter that's being used on the axes
xformatter = plt.gca().xaxis.get_major_formatter()

# Apply it to your data cursor
datacursor(lns1, hover=True, formatter= lambda **kwargs: xformatter(kwargs.get('x')))

如果要指定与x轴上使用的不同的格式,可以使用带有自定义格式字符串的DateFormatter对象。

from matplotlib.dates import DateFormatter

fmt = DateFormatter('%Y-%m-%d')
datacursor(lns1, hover=True, formatter= lambda **kwargs: fmt(kwargs.get('x')))

<强>更新

如果您需要客户标签和日期

fmt = DateFormatter('%Y-%m-%d')
datacursor(lns1, hover=True, formatter= lambda **kwargs: 'customer: {y:.0f}'.format(**kwargs) + 'date: ' + fmt(kwargs.get('x')))

作为附注,datacursor并非像你提到的那样是内置的。它是mpldatacursor的一部分。