【问题标题】:Candlestick chart add_trace(mode="markers") gives wrong output烛台图 add_trace(mode="markers") 给出错误的输出
【发布时间】:2021-07-06 15:37:04
【问题描述】:

我目前正在使用 dash 和 plotly 构建一个财务仪表板。我在仪表板中添加了以下烛台图表:

    candlestick_chart = go.Figure(data=[go.Candlestick(x=financial_data["Date"],
                                     open=financial_data['Open'],
                                     high=financial_data['High'],
                                     low=financial_data['Low'],
                                     close=financial_data['Close'])])

返回预期结果:

我希望能够突出显示特定的烛台(例如使用标记)

我尝试使用add_trace 函数和以下代码来实现这一点:

    candlestick_chart.add_trace(
    go.Scatter(
        x=["2020-07-01"],
        y=["350"],
        mode="markers",
        marker=dict(symbol="6")

    )
)

但这会破坏图表。

为什么会这样?我该如何解决这个问题?

编辑:添加的数据源

我从https://finance.yahoo.com/quote/SPY/history?p=SPY 获得数据,时间段设置为最大值。

我通过以下方式解析数据:

    start = "2000-01-01"
end = "2021-01-01"

# Get a pandas dataframe
datapath = ('D:\\Programmieren\\trading_bot\\etf_data\\SPY.csv')

financial_data = pd.read_csv(datapath,
                             parse_dates=True,
                             index_col=0)

financial_data= financial_data.loc[start:end]
# Process data
financial_data = financial_data["2020-06-01":"2021-01-01"]

financial_data.reset_index(inplace=True)

EDIT2:系统和版本

我的包有以下版本:

print(pd.__version__) # 1.2.3
print(plotly.__version__) # 4.14.3

我正在合作:

  • Windows 10 家庭版(64 位)
  • Python 3.9
  • Python 3.8 也不起作用

【问题讨论】:

  • marker=dict(symbol="6") 的确切用途是什么,因为当我尝试使用它来调试您的问题时,它对我不起作用。您的问题也不是最低限度可重现的,因此尽管我能够使代码适用于我的示例数据而没有遇到您遇到的问题,但仍有可能无法解决您的问题。
  • 如果您单击图像,您应该会看到在这种情况下烛台以箭头突出显示,而不是默认圆圈 (plotly.com/python/marker-style)。删除此行不会改变结果。我应该补充什么以使我的问题变得可重现?
  • 您应该添加一种简单的方法来获取您正在使用的数据,无论是文件还是指向您用来获取数据的任何来源的链接。
  • 我的编辑应该会给你所有的信息。
  • @Ph.lpp 实际上,没有。您的编辑显示了一个数据源,但绝对无法知道这是否真的是您用来生成图形的数据。您的编辑也没有说明与go.Scatter() 一起使用的数据类型。在我看来,您可能使用了string 类型的数据。要产生一个可正确重现的问题,请提供完整的数据 sn-p 以及您的导入 和 数据,例如 this

标签: python plotly candlestick-chart


【解决方案1】:

这可以被视为版本问题,但核心问题是您已将y-value 定义为带有["350"] 的字符串列表,而不是像[350] 这样的数字在:

go.Scatter(
        x=["2020-07-01"],
        y=["350"],
        mode="markers",
        marker=dict(symbol="6")

    )
)

不同版本的 plotly 似乎以不同的方式处理这个问题。只需删除引号,让 Plotly 将值解释为数字即可:

带有示例数据的完整代码

import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd

# data
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
df=df.tail(10)

# set up figure with values not high and not low
# include candlestick with rangeselector
fig = go.Figure(go.Candlestick(x=df['Date'],
                open=df['AAPL.Open'], high=df['AAPL.High'],
                low=df['AAPL.Low'], close=df['AAPL.Close']))

fig.add_trace(
    go.Scatter(
        x=["2017-02-10"],
        y=[135],
        mode="markers+text",
        marker=dict(symbol='triangle-down-open', size = 12),
#         text = 'important',
#         textposition = 'middle right'

    )
)

fig.show()

【讨论】:

    【解决方案2】:

    当我运行您的代码时,我收到以下错误:

    ValueError: 
    Invalid value of type 'builtins.str' received for the 'symbol' property of scatter.marker
        Received value: '6'
    
    The 'symbol' property is an enumeration that may be specified as:
      - One of the following enumeration values:
            [0, 'circle', 100, 'circle-open', 200, 'circle-dot', 300,
            'circle-open-dot', 1, 'square', 101, 'square-open', 201,
            'square-dot', 301, 'square-open-dot', 2, 'diamond', 102,
            'diamond-open', 202, 'diamond-dot', 302,
            'diamond-open-dot', 3, 'cross', 103, 'cross-open', 203,
            'cross-dot', 303, 'cross-open-dot', 4, 'x', 104, 'x-open',
            204, 'x-dot', 304, 'x-open-dot', 5, 'triangle-up', 105,
            'triangle-up-open', 205, 'triangle-up-dot', 305,
            'triangle-up-open-dot', 6, 'triangle-down', 106,
            'triangle-down-open', 206, 'triangle-down-dot', 306,
            'triangle-down-open-dot', 7, 'triangle-left', 107,
            'triangle-left-open', 207, 'triangle-left-dot', 307,
            'triangle-left-open-dot', 8, 'triangle-right', 108,
            'triangle-right-open', 208, 'triangle-right-dot', 308,
            'triangle-right-open-dot', 9, 'triangle-ne', 109,
            'triangle-ne-open', 209, 'triangle-ne-dot', 309,
            'triangle-ne-open-dot', 10, 'triangle-se', 110,
            'triangle-se-open', 210, 'triangle-se-dot', 310,
            'triangle-se-open-dot', 11, 'triangle-sw', 111,
            'triangle-sw-open', 211, 'triangle-sw-dot', 311,
            'triangle-sw-open-dot', 12, 'triangle-nw', 112,
            'triangle-nw-open', 212, 'triangle-nw-dot', 312,
            'triangle-nw-open-dot', 13, 'pentagon', 113,
            'pentagon-open', 213, 'pentagon-dot', 313,
            'pentagon-open-dot', 14, 'hexagon', 114, 'hexagon-open',
            214, 'hexagon-dot', 314, 'hexagon-open-dot', 15,
            'hexagon2', 115, 'hexagon2-open', 215, 'hexagon2-dot',
            315, 'hexagon2-open-dot', 16, 'octagon', 116,
            'octagon-open', 216, 'octagon-dot', 316,
            'octagon-open-dot', 17, 'star', 117, 'star-open', 217,
            'star-dot', 317, 'star-open-dot', 18, 'hexagram', 118,
            'hexagram-open', 218, 'hexagram-dot', 318,
            'hexagram-open-dot', 19, 'star-triangle-up', 119,
            'star-triangle-up-open', 219, 'star-triangle-up-dot', 319,
            'star-triangle-up-open-dot', 20, 'star-triangle-down',
            120, 'star-triangle-down-open', 220,
            'star-triangle-down-dot', 320,
            'star-triangle-down-open-dot', 21, 'star-square', 121,
            'star-square-open', 221, 'star-square-dot', 321,
            'star-square-open-dot', 22, 'star-diamond', 122,
            'star-diamond-open', 222, 'star-diamond-dot', 322,
            'star-diamond-open-dot', 23, 'diamond-tall', 123,
            'diamond-tall-open', 223, 'diamond-tall-dot', 323,
            'diamond-tall-open-dot', 24, 'diamond-wide', 124,
            'diamond-wide-open', 224, 'diamond-wide-dot', 324,
            'diamond-wide-open-dot', 25, 'hourglass', 125,
            'hourglass-open', 26, 'bowtie', 126, 'bowtie-open', 27,
            'circle-cross', 127, 'circle-cross-open', 28, 'circle-x',
            128, 'circle-x-open', 29, 'square-cross', 129,
            'square-cross-open', 30, 'square-x', 130, 'square-x-open',
            31, 'diamond-cross', 131, 'diamond-cross-open', 32,
            'diamond-x', 132, 'diamond-x-open', 33, 'cross-thin', 133,
            'cross-thin-open', 34, 'x-thin', 134, 'x-thin-open', 35,
            'asterisk', 135, 'asterisk-open', 36, 'hash', 136,
            'hash-open', 236, 'hash-dot', 336, 'hash-open-dot', 37,
            'y-up', 137, 'y-up-open', 38, 'y-down', 138,
            'y-down-open', 39, 'y-left', 139, 'y-left-open', 40,
            'y-right', 140, 'y-right-open', 41, 'line-ew', 141,
            'line-ew-open', 42, 'line-ns', 142, 'line-ns-open', 43,
            'line-ne', 143, 'line-ne-open', 44, 'line-nw', 144,
            'line-nw-open']
      - A tuple, list, or one-dimensional numpy array of the above
    

    为了解决这个问题,我只是给了marker 值它指示的值之一,例如我做了marker=dict(symbol='triangle-down-open'),它返回了如下图:

    图表的代码是:

    candlestick_chart = go.Figure(data=[go.Candlestick(x=financial_data["Date"],
                                     open=financial_data['Open'],
                                     high=financial_data['High'],
                                     low=financial_data['Low'],
                                     close=financial_data['Close'])])
    
    
    candlestick_chart.add_trace(
        go.Scatter(
            x=["2020-07-01"],
            y=["350"],
            mode="markers",
            marker=dict(symbol='triangle-down-open')
    
        )
    )
    
    candlestick_chart.show()
    

    【讨论】:

    • 感谢您的建议。但即使在没有我的其他代码的单独文件中,这对我也不起作用。
    • 运行时发生了什么?你有最新版本的 plotly 吗?
    • 它运行没有错误,并且绘图看起来与以前相同(第二张图片),但缩放比例略有不同,因为它不会与 Dash 和我的其他绘图一起显示。版本在第二次编辑中。
    • 这是一个情节版本相关的问题,我正在使用4.9.0,它工作正常,但是当更改为4.14.3时,它不起作用。
    • 谢谢。安装 4.9.0 解决了我的问题
    猜你喜欢
    • 1970-01-01
    • 2019-02-06
    • 2023-01-11
    • 1970-01-01
    • 2020-09-08
    • 2021-02-11
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多