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

时间:2017-07-06 22:01:52

标签: plotly candlestick-chart

请查看此页面中的第二个示例:https://plot.ly/python/candlestick-charts/(在添加自定义文本和注释部分)。如果放大图表,则可以看到该示例在日期'2007-12-01'上插入了一条垂直线。如果日期是交易日(例如'2007-11-29'),那么人们就会看到垂直线经过那天中间的烛台。

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

我想画两个日期之间的垂直线(例如11月29日到11月30日之间 - 上面例子中v线之前的两个烛台)。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

如果要在两个日期之间 查找日期或时间,则应考虑将日期的烛台图构建为熊猫时间戳。在您引用的同一页上的Simple Example with datetime Objects下,您会找到一个示例。但是不用担心,您会在此答案中找到类似方法的完整代码段。

如果您的日期实际上被格式化为熊猫日期戳,则可以使用pd.to_pydatetimehere中所述的各种方法轻松地找到两个日期之间的日期。并且由于plotly已经将x轴解释为时间轴,因此它将接受数据框中日期之间的日期。 Plotly甚至会处理时间戳,不仅是日期,而且还有一天中的时间。

因此,如果您有问题的日期是:

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

使用数据和可绘代码完成代码段:

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()