如何为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
当前效果

解决方案
要实现按订单方向设置散点颜色,有两种简单有效的方式:
方法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
相关产品推荐
相关产品推荐

