Plotly:如何向烛台图表添加交易量

问题描述 投票:0回答:5

代码:

from plotly.offline import init_notebook_mode, iplot, iplot_mpl
    
def plot_train_test(train, test, date_split):
    data = [Candlestick(x=train.index, open=train['open'], high=train['high'], low=train['low'], close=train['close'],name='train'),
           Candlestick(x=test.index, open=test['open'], high=test['high'], low=test['low'], close=test['close'],name='test')
            ]
            layout = {
                'shapes': [
                    {'x0': date_split, 'x1': date_split, 'y0': 0, 'y1': 1, 'xref': 'x', 'yref': 'paper',
                     'line': {'color': 'rgb(0,0,0)', 'width': 1}}],
                'annotations': [{'x': date_split, 'y': 1.0, 'xref': 'x', 'yref': 'paper', 'showarrow': False, 'xanchor': 'left','text': ' test data'},
                    {'x': date_split, 'y': 1.0, 'xref': 'x', 'yref': 'paper', 'showarrow': False, 'xanchor': 'right', 'text': 'train data '}] }
            figure = Figure(data=data, layout=layout)
            iplot(figure)

上面的代码没问题。但现在我想在这个烛台图表中“成交量”

代码:

from plotly.offline import init_notebook_mode, iplot, iplot_mpl
        
def plot_train_test(train, test, date_split):
    data = [Candlestick(x=train.index, open=train['open'], high=train['high'], low=train['low'], close=train['close'],volume=train['volume'],name='train'),
           Candlestick(x=test.index, open=test['open'], high=test['high'], low=test['low'],close=test['close'],volume=test['volume'],name='test')]
            layout = {
                'shapes': [
                    {'x0': date_split, 'x1': date_split, 'y0': 0, 'y1': 1, 'xref': 'x', 'yref': 'paper',
                     'line': {'color': 'rgb(0,0,0)', 'width': 1}}
                ],
                'annotations': [
                    {'x': date_split, 'y': 1.0, 'xref': 'x', 'yref': 'paper', 'showarrow': False, 'xanchor': 'left',
                     'text': ' test data'},
                    {'x': date_split, 'y': 1.0, 'xref': 'x', 'yref': 'paper', 'showarrow': False, 'xanchor': 'right',
                     'text': 'train data '}
                ]
            }
            figure = Figure(data=data, layout=layout)
            iplot(figure) 

错误:

ValueError:为类型对象指定的属性无效 plotly.graph_objs.Candlestick:'体积'

python matplotlib plot plotly
5个回答
30
投票

如果您想在 OHLC 图表下方添加较小的交易量子图,您可以使用:

    rows
  1. cols
    指定子图的网格。
  2. shared_xaxes=True
  3. 用于相同的缩放和过滤
  4. row_width=[0.2, 0.7]
  5. 更改图表的高度比例。 IE。体积图表比 OHLC 更小
    
    
剧情:

import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots # data df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv') # Create subplots and mention plot grid size fig = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.03, subplot_titles=('OHLC', 'Volume'), row_width=[0.2, 0.7]) # Plot OHLC on 1st row fig.add_trace(go.Candlestick(x=df["Date"], open=df["AAPL.Open"], high=df["AAPL.High"], low=df["AAPL.Low"], close=df["AAPL.Close"], name="OHLC"), row=1, col=1 ) # Bar trace for volumes on 2nd row without legend fig.add_trace(go.Bar(x=df['Date'], y=df['AAPL.Volume'], showlegend=False), row=2, col=1) # Do not show OHLC's rangeslider plot fig.update(layout_xaxis_rangeslider_visible=False) fig.show()



26
投票
此处

无论如何,您收到该错误消息只是因为

go.Candlestick

没有

Volume
属性。一开始可能看起来并非如此,但您可以轻松地将
go.Candlestick
设置为单独的跟踪,然后使用以下方法为卷添加单独的
go.Bar()
跟踪:

    fig = make_subplots(specs=[[{"secondary_y": True}]])
  1. fig.add_traces(go.Candlestick(...), secondary_y=True)
  2. fig.add_traces(go.Bar(...), secondary_y=False)
  3. 
    
  4. 剧情:

完整代码:

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') # Create figure with secondary y-axis fig = make_subplots(specs=[[{"secondary_y": True}]]) # include candlestick with rangeselector fig.add_trace(go.Candlestick(x=df['Date'], open=df['AAPL.Open'], high=df['AAPL.High'], low=df['AAPL.Low'], close=df['AAPL.Close']), secondary_y=True) # include a go.Bar trace for volumes fig.add_trace(go.Bar(x=df['Date'], y=df['AAPL.Volume']), secondary_y=False) fig.layout.yaxis2.showgrid=False fig.show()



3
投票

import plotly.graph_objects as go from plotly.subplots import make_subplots candlesticks = go.Candlestick( x=candles.index, open=candles['open'], high=candles['high'], low=candles['low'], close=candles['close'], showlegend=False ) volume_bars = go.Bar( x=candles.index, y=candles['volume'], showlegend=False, marker={ "color": "rgba(128,128,128,0.5)", } ) fig = go.Figure(candlesticks) fig = make_subplots(specs=[[{"secondary_y": True}]]) fig.add_trace(candlesticks, secondary_y=True) fig.add_trace(volume_bars, secondary_y=False) fig.update_layout( title="ETH/USDC pool price data at the very beginning of Uniswap v3", height=800, # Hide Plotly scrolling minimap below the price chart xaxis={"rangeslider": {"visible": False}}, ) fig.update_yaxes(title="Price $", secondary_y=True, showgrid=True) fig.update_yaxes(title="Volume $", secondary_y=False, showgrid=False) fig.show()

您可以在此开源笔记本中找到完整的源代码


1
投票

import plotly.graph_objects as go from plotly.subplots import make_subplots import pandas as pd # Create subplots and mention plot grid size title=df.symbol.unique()[0] fig = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.02, row_width=[0.25, 0.75]) # Plot OHLC on 1st row fig.add_trace(go.Candlestick(x=df.index, open=df['open'], high=df['high'], low=df['low'], close=df['close'],showlegend=False),row=1, col=1,) # Bar trace for volumes on 2nd row without legend # fig.add_trace(go.Bar(x=df.index, y=df['volume'], showlegend=False), row=2, col=1) df['color']='' df['color']=['red' if (x>y) else t for x,y,t in zip(df['open'],df['close'],df['color'])] df['color']=['green' if (x<y) else t for x,y,t in zip(df['open'],df['close'],df['color'])] colors=df.color.tolist() df['prev_color']=[colors[0]]+colors[:(len(colors)-1)] df.loc[((df.open==df.close) & (df.color=='')),'color']=[z for x,y,z,t in zip(df['open'],df['close'],df['prev_color'],df['color']) if (x==y and t=='')] colors=df.color.tolist() df['prev_color']=[colors[0]]+colors[:(len(colors)-1)] df.loc[((df.open==df.close) & (df.color=='')),'color']=[z for x,y,z,t in zip(df['open'],df['close'],df['prev_color'],df['color']) if (x==y and t=='')] markers=['green','red'] for t in markers: df_tmp=df.loc[~(df.color==t)] ## somehow the color it takes is opposite so take negation to fig.add_trace(go.Bar(x=df_tmp.index, y=df_tmp['volume'], showlegend=False), row=2, col=1) # Do not show OHLC's rangeslider plot fig.update(layout_xaxis_rangeslider_visible=False) fig.layout.yaxis2.showgrid=False fig.update_layout(title_text=title,title_x=0.45) fig.show()



0
投票
marker_color

。想想看,是什么让蜡烛变成绿色的?收盘价高于开盘价这一事实,以及红色蜡烛又如何呢?好吧,收盘价低于开盘价,所以有了这个基础知识:

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

# Create a Figure with 2 subplots, one will contain the candles
# the other will contain the Volume bars
figure = make_subplots(rows=2, cols=1, shared_xaxes=True, row_heights=[0.7, 0.3])

# Plot the candles in the first subplot
figure.add_trace(go.Candlestick(x=df.index, open=df.open, high=df.high, low=df.low, close=df.close, name='price',
                                increasing_line_color='#26a69a', decreasing_line_color='#ef5350'),
                 row=1, col=1)

# From our Dataframe take only the rows where the Close > Open
# save it in different Dataframe, these should be green
green_volume_df = df[df['close'] > df['open']]
# Same for Close < Open, these are red candles/bars
red_volume_df = df[df['close'] < df['open']]

# Plot the red bars and green bars in the second subplot
figure.add_trace(go.Bar(x=red_volume_df.index, y=red_volume_df.volume, showlegend=False, marker_color='#ef5350'), row=2,
                 col=1)
figure.add_trace(go.Bar(x=green_volume_df.index, y=green_volume_df.volume, showlegend=False, marker_color='#26a69a'),
                 row=2, col=1)

# Hide the Range Slider
figure.update(layout_xaxis_rangeslider_visible=False)
figure.update_layout(title=f'BTC/USDT', yaxis_title=f'Price')
figure.update_yaxes(title_text=f'Volume', row=2, col=1)
figure.update_xaxes(title_text='Date', row=2)

参考文献

    https://plotly.com/python/subplots/
  • https://plotly.com/python/candlestick-charts/
© www.soinside.com 2019 - 2024. All rights reserved.