python - Python Matplotlib 在图形上悬停时显示光标
问题描述
我想绘制如下 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”,第 48 行,在 main(ptvsdArgs) 文件“c: \Users\Sam.vscode\extensions\ms-python.python-2020.6.89148\pythonFiles\lib\python\old_ptvsd\ptvsd_main _.py ”,第 432 行,在 main 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=' main') 文件“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): 文件 "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 行,在在刷新 dmin 中调用 self.refresh() 文件“C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\dates.py”,第 1364 行,dmax = self.viewlim_to_dt () File "C:\Users\Sam\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\dates.py",第 1098 行,在 viewlim_to_dt .format(vmin)) ValueError: view limit minimum -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()
解决方案
我不熟悉 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/
希望这会有所帮助,尽管它当然与您尝试做的不同!
推荐阅读
- flutter - 滚动时小部件闪烁并消失
- iot - 物联网中心自定义规则
- r - 检测语言环境时出错:read.table 中的错误(file = file,header = header .. 如何解决这个问题?
- python - 自己的类的类似 Numpy 的方法
- acumatica - DAC 中的 DateTime 字段导致异常
- .net-core - Azure 函数服务总线主题触发器休眠
- matrix - 找出循环的 CSR x CSR 矩阵乘法
- python-3.x - pyModbusTCP 每秒失败一次功能
- swift - SwiftUI onTapGesture interact with caller only
- angular - 在浏览器中打开 devtools 之前,传单地图未完全渲染 - 角度版本 10 中面临的问题