Я хочу построить цену закрытия 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 = ' main ') File" C: \ Users \ Sam \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ runpy.py ", строка 263, в пути_запуска pkg_name = pkg_name, script_name = fname) File" C: \ Users \ Sam \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ runpy.py ", строка 96 , в _run_module_code имя_мода, тип_мода c, имя_пакета, скрипт_ имя) Файл "C: \ Users \ Sam \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ runpy.py", строка 85, в _run_code exe c (код, 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): File" 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) File" C: \ Users \ Sam \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ matplotlib \ axis.py ", строка 1320, в get_ticklabels return self.get_majorticklabels () File" 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 \ матпл otlib \ axis.py ", строка 1431, в get_major_ticks numticks = len (self.get_majorticklocs ()) File" C: \ Users \ Sam \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ matplotlib \ axis.py ", строка 1348, в get_majorticklocs return self.major.locator () File" C: \ Users \ Sam \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ matplotlib \ates. py ", строка 1338, в call self.refre sh () File" C: \ Users \ Sam \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ matplotlib \ date.py ", строка 1364, в файле refresh dmin, dmax = self.viewlim_to_dt () File" C: \ Users \ Sam \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ matplotlib \ates .py ", строка 1098, в viewlim_to_dt .format (vmin)) ValueError: минимальный предел просмотра -36879.777083333334 меньше 1 и является недопустимым значением даты Matplotlib. Это часто случается, если вы передаете значение, отличное от datetime, на ось, которая имеет единицы datetime
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()