首页 > 解决方案 > 在 plotly 中绘制水平线

问题描述

我正在尝试使用 plotly 将水平线叠加到烛台图表上。但是,当我无法让水平线从它们的“x”坐标开始时,该坐标位于df['date'][level[0]]. 相反,水平线从 ax=0 开始。

以下是到目前为止我设法收集的内容,我想这对有经验的人来说并不漂亮。

但是,任何提供帮助的指针将不胜感激:

import plotly.graph_objects as go
from plotly.offline import plot
import datetime as dt
from pandas import DataFrame
import numpy as np
import pandas as pd



hovertext=[]
for i in range(len(df['bidopen'])):
    hovertext.append('Datetime: '+str(df['date'][i])+'<br>Open: '+str(df['bidopen'][i])+'<br>Close: '+str(df['bidclose'][i]))


fig = go.Figure(data=go.Candlestick(x=df['date'],
                open=df['bidopen'],
                high=df['bidhigh'],
                low=df['bidlow'],
                close=df['bidclose'],
                text=hovertext,
                hoverinfo='text'))

for level in levels:
    fig.add_hline(level[1], df['date'][level[0]], exclude_empty_subplots=True)


plot(fig)

这是我的 plotly 代码当前生成的屏幕截图(当前输出):

在此处输入图像描述

以下是我试图在水平线方面实现的目标(所需的输出):

在此处输入图像描述

..第二个屏幕截图代表了我能够使用 matplotlib 生成的内容

标签: pythonplotlyhorizontal-line

解决方案


由于hline()将图在两侧扩展到无穷大,您可以使用add_shape()方法。

考虑如下数据框:

df = pd.DataFrame(data = {'levels':np.random.random(10)*10, 
                          'dates':pd.date_range(start = '2020-11-01', periods = 10)})
df

    levels  dates
0   9.149079    2020-11-01
1   0.294123    2020-11-02
2   5.401443    2020-11-03
3   4.043063    2020-11-04
4   8.878100    2020-11-05
5   5.275614    2020-11-06
6   4.425696    2020-11-07
7   8.228720    2020-11-08
8   7.632410    2020-11-09
9   7.045191    2020-11-10

&一个已经有你想要的日期作为索引的数字:

在此处输入图像描述

您可以执行以下操作:

for row in df.iterrows():
    fig.add_shape(type="line", x0= row[1]['dates'], 
                            y0 = row[1]['levels'],
                            x1 = df.dates.max(),
                            y1 = row[1]['levels'], fillcolor = 'yellow')
fig

结果是:

在此处输入图像描述


推荐阅读