【问题标题】:Python Matplotlib show the cursor when hovering on graphPython Matplotlib 在图形上悬停时显示光标
【发布时间】:2020-10-11 09:35:56
【问题描述】:

我想绘制 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)

Traceback(最近一次调用最后一次):文件 "c:\Users\Sam.vscode\extensions\ms-python.python-2020.6.89148\pythonFiles\ptvsd_launcher.py", 第 48 行,在 主(ptvsdArgs)文件“c:\Users\Sam.vscode\extensions\ms-python.python-2020.6.89148\pythonFiles\lib\python\old_ptvsd\ptvsd_main_.py”, 第 432 行,主要 run() 文件 "c:\Users\Sam.vscode\extensions\ms-python.python-2020.6.89148\pythonFiles\lib\python\old_ptvsd\ptvsd_main_.py", 第 316 行,在 run_file 中 runpy.run_path(target, run_name='ma​​in') 文件 "C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\runpy.py", 第 263 行,在 run_path 中 pkg_name=pkg_name, script_name=fname) 文件 "C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\runpy.py", 第 96 行,在 _run_module_code 中 mod_name, mod_spec, pkg_name, script_name) 文件 "C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\runpy.py", 第 85 行,在 _run_code 中 exec(code, run_globals) 文件“c:\Users\Sam\OneDrive\Project\stock\test.py”,第 89 行,在 plt.gcf().autofmt_xdate() 文件“C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\figure.py”, 第 632 行,在 autofmt_xdate 中 对于 self.axes[0].get_xticklabels(which=which) 中的标签:文件“C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\axes_base.py”, 第 3355 行,在 get_xticklabels 中 返回 self.xaxis.get_ticklabels(minor=minor, which=which) 文件“C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\axis.py”, 第 1320 行,在 get_ticklabels 中 返回 self.get_majorticklabels() 文件“C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\axis.py”, 第 1276 行,在 get_majorticklabels 文件中 "C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\axis.py", 第 1431 行,在 get_major_ticks 中 numticks = len(self.get_majorticklocs()) 文件 "C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\axis.py", 第 1348 行,在 get_majorticklocs 中 返回 self.major.locator() 文件 "C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\dates.py", 第 1338 行,在 call 中 self.refresh() 文件 "C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\dates.py", 第 1364 行,刷新中 dmin, dmax = self.viewlim_to_dt() 文件 "C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\dates.py", 第 1098 行,在 viewlim_to_dt .format(vmin)) ValueError:查看限制最小值 -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()

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    我不熟悉 SnaptoCursor,但您是否考虑过使用 plotly 代替?

    节省多行代码,非常人性化:

    # 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/

    您也可以使用光标与绘图进行交互,例如:

    希望这会有所帮助,当然这与您尝试做的不同!

    【讨论】:

    • 谢谢。那是我可以探索的另一个图书馆
    猜你喜欢
    • 2016-07-11
    • 2015-12-19
    • 1970-01-01
    • 2013-12-22
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2021-09-15
    相关资源
    最近更新 更多