You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Plotly蜡烛图上的散点标记按订单方向设置颜色

问题与解决方案

自行复现所需资源

  • CANDLESTICK CSV
  • ORDERS CSV

初始实现代码

import pandas as pd
import plotly.graph_objects as go

def plot_ohlcv_plotly(df, orders):
        df.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
        df['Date'] = pd.to_datetime(df['Date'], unit='ms')
        fig = go.Figure(
            data=[go.Candlestick(
                    x=df['Date'],
                    open=df['Open'],
                    high=df['High'],
                    low=df['Low'],
                    close=df['Close'])])

        date = pd.to_datetime(orders['timestamp'], unit='ms')

        size = orders['size'] * 0.5

        fig.add_trace(go.Scatter(x=date, y=orders['price'], mode="markers", marker = dict(
                # color = orders['color'], <-- 颜色设置位置
                size=size
            )
        ))

        fig.show()


df = pd.read_csv('btcusdt-orders.csv')
candles = pd.read_csv('btcusdt-candles.csv')

grouped_multiple = df.groupby(['timestamp']).agg({'size': ['sum'], 'price': ['mean'], 'side':['first']})
grouped_multiple.columns = ['size', 'price', 'side']
orders = grouped_multiple.reset_index()

orders = orders.loc[orders['size'] > 20]

# pepe.plot_orders(grouped_multiple)
plot_ohlcv_plotly(candles, orders)

问题描述

已实现在Plotly蜡烛图上叠加展示指定时间段内大额订单的散点图,但需要将散点标记颜色与订单方向匹配:buy订单标记设为绿色,sell订单标记设为红色。

核心问题:如何根据订单的buy/sell方向,为散点标记分别设置绿色和红色?

尝试过Python三元赋值语句,但出现Series真值无法评估的错误:

color = 'green' if orders['color'] == 'buy' else 'red'

错误提示需使用.all()、.any()等方法判断真值,但这些方法无法为每个散点单独设置颜色。也曾尝试基于side列新增颜色列,同样未成功。

当前绘图函数

def plot_ohlcv_plotly(self, df, orders):
    df.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
    df['Date'] = pd.to_datetime(df['Date'], unit='ms')
    fig = go.Figure(
        data=[go.Candlestick(
                x=df['Date'],
                open=df['Open'],
                high=df['High'],
                low=df['Low'],
                close=df['Close'])])

    date = pd.to_datetime(orders['timestamp'], unit='ms')

    size = orders['size'] * 0.5

    fig.add_trace(go.Scatter(x=date, y=orders['price'], mode="markers", marker = dict(
            # color = orders['color'],
            size=size
        )
    ))

    fig.show()

订单CSV示例数据

timestamp,size,price,side
1664567708302,20.55188,19560.0,buy
1664568424915,29.02367,19450.0,buy
1664568480558,29.38344,19489.29,buy
1664569334535,30.37156,19490.0,sell
1664572312440,26.37094,19370.0,buy
1664572667156,25.87512,19350.0,sell
1664572746101,20.66364,19300.1,sell
1664572746103,53.43113,19300.0,sell
1664575734563,44.57541,19250.0,sell
1664575734563,31.07015,19250.0,buy
1664575734594,31.94762,19250.0,buy
1664577201634,22.63745,19345.01,sell
1664579865001,29.92649,19390.18,sell
1664581629722,22.07112,19427.09,sell

当前效果

当前所有散点标记均显示为sell对应的颜色


解决方案

要实现按订单方向设置散点颜色,有两种简单有效的方式:

方法1:使用pandas.Series.map()生成颜色列表

直接对orders['side']列进行映射,生成对应颜色的Series,然后传递给marker的color参数:

def plot_ohlcv_plotly(df, orders):
    df.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
    df['Date'] = pd.to_datetime(df['Date'], unit='ms')
    fig = go.Figure(
        data=[go.Candlestick(
                x=df['Date'],
                open=df['Open'],
                high=df['High'],
                low=df['Low'],
                close=df['Close'])])

    date = pd.to_datetime(orders['timestamp'], unit='ms')
    size = orders['size'] * 0.5
    
    # 生成颜色映射
    colors = orders['side'].map({'buy': 'green', 'sell': 'red'})

    fig.add_trace(go.Scatter(x=date, y=orders['price'], mode="markers", marker = dict(
            color=colors,
            size=size
        )
    ))

    fig.show()

方法2:使用numpy.where()条件赋值

通过numpy的where函数根据条件生成颜色数组:

import numpy as np

def plot_ohlcv_plotly(df, orders):
    df.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
    df['Date'] = pd.to_datetime(df['Date'], unit='ms')
    fig = go.Figure(
        data=[go.Candlestick(
                x=df['Date'],
                open=df['Open'],
                high=df['High'],
                low=df['Low'],
                close=df['Close'])])

    date = pd.to_datetime(orders['timestamp'], unit='ms')
    size = orders['size'] * 0.5
    
    # 条件生成颜色
    colors = np.where(orders['side'] == 'buy', 'green', 'red')

    fig.add_trace(go.Scatter(x=date, y=orders['price'], mode="markers", marker = dict(
            color=colors,
            size=size
        )
    ))

    fig.show()

这两种方法都能为每个散点单独设置对应颜色,解决之前的Series真值评估问题。因为它们都是针对整个Series/数组进行元素级别的操作,而非尝试判断整个Series的真值。


内容的提问来源于stack exchange,提问作者Pat McDermott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:25:24