当前位置: 首页 > 知识库问答 >
问题:

Python Matplotlib在图形上悬停时显示光标

葛安和
2023-03-14

我想绘制INS的收盘价如下,它的工作原理。然后我想在图形上悬停时添加光标。我跟随https://matplotlib.org/3.1.0/gallery/misc/cursor_demo_sgskip.html的演示,这就是我想要的。

但当我将这些行添加到代码中时,它显示值错误。最初我使用历元时间作为x轴,我认为这就是问题所在,所以我将历元时间转换为日期时间,但它仍然不起作用,并且什么也没有绘制。

snap_cursor = SnaptoCursor(ax, secs, df['close'])
fig.canvas.mpl_connect('motion_notify_event', snap_cursor.mouse_move)

回溯(最后一次调用):文件“c:\Users\Sam.vscode\extensions\ms python.python-2020.6.89148\pythonFiles\ptvsd_launcher.py”,主(ptvsdArgs)文件“c:\Users\Sam.vscode\extensions\ms python.python-2020.6.89148\pythonFiles\lib\python\old\ptvsd\ptvsd\ptvsd\ptvsd_main.py”第48行,主运行()文件第432行“c:\Users\Sam.vscode\extensions\ms python.python-2020.6.89148\pythonFiles\lib\python\old\ptvsd\ptvsd\u main.py”,第316行,在run\u文件runpy.run\u path(target,run\u name='main')文件“c:\Users\Sam\AppData\Local\Programs\python\Python36\lib\runpy.py”,第263行,在run\u路径pkg\u name=pkg\u name=pkg\u name)文件中”C:\Users\Sam\AppData\Local\Programs\Python36\lib\runpy.py”,第96行,在运行模块代码mod\u name,mod\u spec,pkg\u name,script\u name)文件“C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\runpy.py”,第85行,在运行代码执行(代码,运行全局)文件“C:\Users\Sam\OneDrive\Project\stock\test.py”第89行,在plt.gcf()中。autofmt文件“C:\Users\Sam\AppData\Local\Programs\Python 36\lib\site packages\matplotlib\figure.py”,第632行,在self.axes[0]中的标签的autofmt\xdate中。get\xticklabels(which=which):文件“C:\Users\Sam\AppData\Local\Programs\Python\Python 36\lib\site packages\matplotlib\axes\axes\base.py”,第3355行,在get\xticklabels return.xaxis.get\tables中(minor=minor,which=which)文件“C:\Users\Sam\AppData\Local\Programs\Python36\lib\site packages\matplotlib\axis.py”,第1320行,在get\majorticklabels返回self.get\majorticklabels()文件“C:\Users\Sam\AppData\Local\Programs\Python36\lib\site packages\matplotlib\axis.py”,第1276行,在get\majorticklabels文件中C:\Users\Sam\AppData\Local\Programs\Python36\lib\site packages\matplotlib\axis.py”,第1431行,在get\u major\ticks numticks=len(self.get\u majorticklocs())文件“C:\Users\Sam\AppData\Local\Programs\Python36\lib\site packages\matplotlib\axis.py”中,第1348行,在get\u majorticklocks return.major.locator()文件中C:\Users\Sam\AppData\Local\Programs\Python36\lib\site packages\matplotlib\dates.py”,第1338行,在call self.refresh()文件“C:\Users\Sam\AppData\Local\Programs\Python36\lib\site packages\matplotlib\dates.py”中,第1364行,在refresh dmin,dmax=self.viewlim\u to\u dt()文件中C:\Users\Sam\AppData\Local\Programs\Python36\lib\site packages\matplotlib\dates.py”,viewlim_to_dt.format(vmin))值中的第1098行错误:视图限制最小值-36879.777083333334小于1,是无效的matplotlib日期值。如果将非日期时间值传递给具有日期时间单位的轴,则通常会发生这种情况

class SnaptoCursor(object):
    """
    Like Cursor but the crosshair snaps to the nearest x, y point.
    For simplicity, this assumes that *x* is sorted.
    """

    def __init__(self, ax, x, y):
        self.ax = ax
        self.lx = ax.axhline(color='k')  # the horiz line
        self.ly = ax.axvline(color='k')  # the vert line
        self.x = x
        self.y = y
        # text location in axes coords
        self.txt = ax.text(0.7, 0.9, '', transform=ax.transAxes)

    def mouse_move(self, event):
        if not event.inaxes:
            return

        x, y = event.xdata, event.ydata
        indx = min(np.searchsorted(self.x, x), len(self.x) - 1)
        x = self.x[indx]
        y = self.y[indx]
        # update the line positions
        self.lx.set_ydata(y)
        self.ly.set_xdata(x)

        self.txt.set_text('x=%1.2f, y=%1.2f' % (x, y))
        print('x=%1.2f, y=%1.2f' % (x, y))
        self.ax.figure.canvas.draw()

data = td.pricehistory("INS")
df = pd.DataFrame(data['candles'])
df['datetime'] = df.apply(lambda x: datetime.datetime.fromtimestamp(x['datetime']/1000),axis=1)
secs = df['datetime']
fig, ax = plt.subplots(1, 1)  
ax.plot(secs,df['close']) 

snap_cursor = SnaptoCursor(ax, secs, df['close'])
fig.canvas.mpl_connect('motion_notify_event', snap_cursor.mouse_move)

plt.gcf().autofmt_xdate()
myFmt = mdates.DateFormatter('%d-%m-%y %H:%M:%S')
plt.gca().xaxis.set_major_formatter(myFmt)

plt.show()

共有1个答案

怀浩大
2023-03-14

我不熟悉SnaptoCouror,但是你有没有考虑过使用ploly来代替?

保存了许多行代码,并且非常用户友好:

# install plotly library
!pip install plotly

# import express module
import plotly.express as px

# plot interactive line chart
fig = px.line(data=df, x="datetime", y="close")
fig.show()

它也非常灵活。这里是留档:https://plotly.com/python/line-charts/

希望这有所帮助,尽管当然这与你试图做的不同!

 类似资料:
  • 我使用Chart.js库绘制条形图,我想显示工具提示不仅在条形图悬停,而且在x轴标签悬停该条形图。我找到了用于配置的方法,但它只允许我访问当前悬停栏的数组,这是没有用的。 那个么,我怎样才能访问鼠标事件,并从那个里获取位置,将其与条形标签的位置进行比较呢?还是有别的办法? 我当前的配置: 它只打印出悬停条数据,但我坚持要想出如何扩展它以满足我需要的行为。

  • 我有一个使用chart.js创建的条形图。页面加载时一切正常,但当我使用daterangepicker更改时间范围时,出现了一个小故障。新数据被引入,但当我将鼠标悬停在上面时,旧数据会显示出来。我是javascript新手,希望能得到一些帮助。看起来我需要合并。销毁();不知怎么的,但我不知道怎么做。下面是我的代码片段: 破坏原始数据的最佳方法是什么,以便当我更改日期范围并将鼠标悬停在新图表上时,

  • 问题内容: 我将鼠标悬停在图像上时要显示说明。我已经以一种不太理想的方式做到了这一点,在这里使用了图像精灵和鼠标悬停:我希望它看起来像我的样子,但是使用真实文本而不是图像。 我尝试了几种不同的方法,但似乎无法弄清楚该怎么做。我正在尝试仅使用HTML和CSS进行操作,但不确定是否可行。 请随意在我的代码中四处浏览,我将粘贴我认为与之相关的内容。 HTML 这很简单。将图片和“出现在悬停时”说明包装在

  • 我是javascript新手 我有一个使用chart.js创建的条形图。页面加载时一切正常,但当我更改值时,会出现小故障。新数据被引入,但当我将鼠标悬停在上面时,旧数据会显示出来。 当我更改日期范围并将鼠标悬停在新图表上时,销毁原始数据的最佳方法是什么?非常感谢。

  • 问题内容: 我试图当鼠标移到图像的左下方时出现一个小框。在该框内,将有一个指向其他页面的链接。 这有点类似于我想要的东西,但是盒子要更小并且不连接到图像的边框。 我已经尝试了一切,但找不到答案。而且我不想使用工具提示,更不用说我没有任何JavaScript知识了。我真的希望这是CSS。 问题答案: 这是在CSS3中使用伪元素。 HTML: CSS: 相反,这是使用jquery达到相同结果的一种方式

  • 问题内容: 我有一个用TKinter在Python中制作的GUI。我希望能够在鼠标光标移动到标签或按钮上方时显示一条消息。这样做的目的是向用户解释按钮/标签的作用或代表什么。 将鼠标悬停在tkinter对象上时,是否可以显示文本? 问题答案: 您需要在和事件上设置绑定。 注意:如果选择弹出窗口(即工具提示),请确保不要将其直接弹出在鼠标下方。因为光标离开标签并进入弹出窗口,将导致离开事件触发。然后