微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将带有偏移量的箭头注释添加到具有日期时间 x 轴的散景图 更正的代码

如何解决如何将带有偏移量的箭头注释添加到具有日期时间 x 轴的散景图 更正的代码

我想在 2 ma 相互交叉时画一个箭头或点,就像当短 ma 在长 ma 上方交叉时会有向上的箭头等,但我不知道如何在日期时间绘制。我尝试使用此代码,但它只会给我错误

#plot short ma and long ma
p.line(df['Date'],df['short_ma'],color='red')
p.line(df['Date'],df['long_ma'],color='black')

p.add_layout(Arrow(end=VeeHead(size=35),line_color="red",x_start=df['Date'],y_start=df['crossabove']+5,x_end=df['Date'],y_end=df['Date']))
#the crossabove + 5 so the arrow draw above where the cross occur 

我为预期的结果发布了一张图片the result i expect

绘制烛台图并在 2 EMA 交叉时添加箭头的代码

import pandas as pd
import numpy as np
import timeit
import talib as tb
import datetime
import random
from bokeh.models import Arrow,normalHead,OpenHead,VeeHead
from bokeh.plotting import figure,output_file,show

df =  pd.read_csv("D:/testdata/msft.csv") #open csv
df['short_ema'] = tb.EMA(df['Close'],100) # short ema
df['long_ema'] = tb.EMA(df['Close'],200)  #long ema
df = df.round(2)    #round to 2
df['Date']=pd.to_datetime(df['Date'])
#print(df.dtypes)
#chart figures
p = figure(plot_width=1400,plot_height=860,x_axis_type='datetime',)

#candle
inc = df.Close > df.Open
dec = df.Open > df.Close
w = 12*60*60*1000 # half day in ms
p.segment(df['Date'],df['High'],df.Date,df.Low,color="black")
p.vbar(df['Date'][inc],w,df.Open[inc],df.Close[inc],fill_color="#D5E1DD",line_color="black")
p.vbar(df['Date'][dec],df.Open[dec],df.Close[dec],fill_color="#F2583E",line_color="black")

#ma lines
p.line(df['Date'],df['short_ema'],df['long_ema'],color='black')
                                     
#df.to_csv("D:/testdata/msft result.csv")

#loop for cross add arrow
match = df[((df.short_ema.shift(1) > df.long_ema.shift(1)) & (df.short_ema.shift(2)< df.long_ema.shift(2)))]

for x_,(y_,_) in match[['Date','long_ema']].iterrows():
    print(x_,y_)
    p.add_layout(Arrow(end=VeeHead(line_color="blue",line_width=4,fill_color='blue'),line_color='blue',y_start= y_ + 3,y_end=y_ + 1))

show(p)

enter image description here

解决方法

  • 对于 Arrowx_startx_end 必须是 datetime 格式,而不是 stringdataframe
    • x_start=pd.to_datetime('2010-10-09')
    • 箭头的坐标不能作为数据帧传递,它们必须作为单独的值传递,这在下面的循环中完成。
      • x_ 是日期时间索引中的日期。
      • y_ 是 y 交点,可以向其添加偏移量(例如 +5
  • 使用了此 example,并向其中添加了 arrows
  • 有关文本注释,请参阅 Labels
import pandas as pd
from bokeh.models import Arrow,NormalHead,OpenHead,VeeHead,Label
from bokeh.plotting import figure,show
from bokeh.sampledata.glucose import data
from bokeh.io import output_notebook,curdoc  # output_file
output_notebook()

# for a file,uncomment the next line and output_file in the imports
# output_file("box_annotation.html",title="box_annotation.py example")

TOOLS = "pan,wheel_zoom,box_zoom,reset,save"

#reduce data size
data = data.loc['2010-10-06':'2010-10-13'].copy()

# test line to show where glucose and line cross each other
data['line'] = 170

# determine where the lines cross
match = data[data.glucose == data.line]

p = figure(x_axis_type="datetime",tools=TOOLS)

p.line(data.index.to_series(),data['glucose'],line_color="gray",line_width=1,legend_label="glucose")
p.line(data.index.to_series(),data['line'],line_color="purple",legend_label="line")

# add arrows to all spots where the lines are equal
for x_,(y_,_) in match[['glucose','line']].iterrows():
    
    p.add_layout(Arrow(end=VeeHead(line_color="blue",line_width=4,fill_color='blue'),line_color='blue',x_start=x_,y_start= y_ + 130,x_end=x_,y_end=y_ + 5))

p.title.text = "Glucose Range"
p.xgrid[0].grid_line_color=None
p.ygrid[0].grid_line_alpha=0.5
p.xaxis.axis_label = 'Time'
p.yaxis.axis_label = 'Value'

show(p)

enter image description here

更新

  • 在以下部分:
    • x_start=df['Date']x_end=df['Date'] 用于代替 x_,后者应该是单个日期值,而不是 Series 的日期。
    • for-loop 将错误的值选择为 x_y_。在我原来的 match 中,日期在索引中,但您的 match 在列中有日期。
match = df[((df.short_ema.shift(1) > df.long_ema.shift(1)) & (df.short_ema.shift(2)< df.long_ema.shift(2)))]

for x_,_) in match[['Date','long_ema']].iterrows():
    print(x_,y_)
    p.add_layout(Arrow(end=VeeHead(line_color="blue",x_start=df['Date'],y_start= y_ + 3,x_end=df['Date'],y_end=y_ + 1))

更正的代码

for _,(x_,y_) in match[['Date',y_end=y_ + 1))

show(p)

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。