Plotly:如何在K线图中绘制日期之间的垂直线?

4

请看第三个实例 这里(在“添加自定义文本和注释”一节中)。如果您放大图表,您会发现该示例在日期'2007-12-01'上插入了一条垂直线。如果日期是一个交易日(例如'2007-11-29'),那么该垂直线将穿过那天蜡烛图的正中央。

Plotly's example. Adding a v-line on a date.

我希望在两个日期之间绘制一条垂直线(例如,在上面示例中的v-line之前的两个蜡烛图之间的11月29日和11月30日之间)。我该如何做到这一点?
1个回答

2
如果您想要在两个日期之间找到一个日期或时间,您应该考虑使用作为Pandas时间戳的日期构建您的蜡烛图。您可以在页面上稍后的“DateTime对象的简单示例”下方找到示例。但不用担心,您将在本答案中找到类似方法的完整代码片段。
如果您的日期实际上已经格式化为Pandas日期时间戳,则可以使用pd.to_pydatetime和描述的各种方法轻松地找到两个日期之间的日期。由于Plotly已将x轴解释为时间线,因此它将接受在数据帧中日期之间出现的日期,甚至处理时间戳不仅表示日期,还表示时间。
因此,如果您所询问的日期是:
datetime.datetime(2020, 10, 11, 0, 0)

并且:

datetime.datetime(2020, 10, 12, 0, 0)

如果按照下面的方法,您将会得到:
datetime.datetime(2020, 10, 11, 12, 0)

这将为您提供两个日期之间的线,就像您所请求的那样。
看一下:

enter image description here

完整的代码片段,包括数据和 Plotly 代码:
import pandas as pd
import plotly.graph_objects as go
from datetime import datetime

# data
open_data = [33.0, 33.3, 33.5, 33.0, 34.1]
high_data = [33.1, 33.3, 33.6, 33.2, 34.8]
low_data = [32.7, 32.7, 32.8, 32.6, 32.8]
close_data = [33.0, 32.9, 33.3, 33.1, 33.1]
dates = [datetime(year=2020, month=10, day=10),
         datetime(year=2020, month=10, day=11),
         datetime(year=2020, month=10, day=12),
         datetime(year=2020, month=10, day=13),
         datetime(year=2020, month=10, day=14)]


# data organized in a pandas dataframe
df=pd.DataFrame(dict(open=open_data,
                    high=high_data,
                    low=low_data,
                    close=close_data,
                    dates=dates))

# calculations using to_pydatetime() to get the date/time
# between your dates
a=df.dates.iloc[1].to_pydatetime()
b=df.dates.iloc[2].to_pydatetime()
linedate = a + (b - a)/2

# plotly figure setup
fig = go.Figure(data=[go.Candlestick(x=df.dates,
                       open=open_data, high=high_data,
                       low=low_data, close=close_data)])

# edit layouts
fig.update_layout(
    title='Dates are pandas timestamps',
    yaxis_title='AAPL Stock',
    shapes = [dict(
        x0=linedate, x1=linedate, y0=0, y1=1, xref='x', yref='paper',
        line_width=2)],
    annotations=[dict(x=linedate, y=0.8, xref='x', yref='paper',font=dict(
                        color="blue",size=14),
        showarrow=False, xanchor='left', text='Vertical line between two dates')]
)

fig.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接