我有以下代码行来生成如下所示的图。
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()
我想要做的是,当我将鼠标悬停在标记上时显示弹出框。但是随着我的代码,无论我移动光标,我都会弹出。
还可以在弹出窗口中显示日期吗?
答案 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
的一部分。