【问题标题】:Plotting candlesticks and volume bars in Bokeh on the same figure在同一图形上绘制散景中的烛台和音量条
【发布时间】:2021-02-18 01:38:12
【问题描述】:

基本上,我想做与shown in this question 相同的事情,但有两个额外的修改:

  • 将烛台和交易量合二为一
  • 有两个 y 轴,以便它们独立滚动/缩放(例如,当烛台轴被滚轮缩放时,只有烛台的大小应该改变,而不是成交量条 - 反之亦然成交量条)

Bokeh 可以做到这一点吗?

【问题讨论】:

    标签: python bokeh


    【解决方案1】:

    是的,可以将两个图形合并为一个。但据我所知,无法通过单击轴来选择数据。而是添加了一个图例来隐藏您不关注的数据。

    如果您还没有数据,请先运行此 sn-p。

    import bokeh
    bokeh.sampledata.download()
    

    这是创建图形的代码。

    import pandas as pd
    import numpy as  np
    from bokeh.plotting import figure, output_notebook, show
    from bokeh.sampledata.stocks import MSFT
    from bokeh.models import LinearAxis, Range1d, Segment, Legend
    output_notebook()
    
    df = pd.DataFrame(MSFT)[:50]
    df["date"] = pd.to_datetime(df["date"])
    inc = df.close > df.open
    dec = df.open > df.close
    w = 12*60*60*1000 # half day in ms
    
    TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
    p = figure(x_axis_type="datetime", tools=TOOLS, 
               plot_width=700, plot_height=300, 
               title = "MSFT Candlestick with Volume")
    p.add_layout(Legend(click_policy="hide", orientation='horizontal', spacing=20), 'below')
    # left y axis
    low, high  = df[['open', 'close']].min().min(), df[['open', 'close']].max().max()
    diff = high-low
    p.y_range = Range1d(low-0.1*diff, high+0.1*diff)
    p.yaxis.axis_label = 'Price'
    p.segment(df.date, df.high, df.date, df.low, color="black", legend_label='Candlestick')
    p.vbar(df.date[inc], w, df.open[inc], df.close[inc], 
           fill_color="#D5E1DD", line_color="black", legend_label='Candlestick')
    p.vbar(df.date[dec], w, df.open[dec], df.close[dec], 
           fill_color="#F2583E", line_color="black", legend_label='Candlestick')
    # right y axis
    p.extra_y_ranges.update({'two':  Range1d(0, 1.1*df.volume.max())})
    p.add_layout(LinearAxis(y_range_name='two', axis_label='Volume' ), 'right')
    p.vbar(df.date, w, df.volume, [0]*df.shape[0], alpha=0.5, level='underlay', 
           legend_label='Volume', y_range_name='two')
    show(p)
    

    创建的图形如下所示:

    【讨论】:

    • 您知道 Bokeh 中是否有一种方法可以让用户在浏览器内部用鼠标在图表上画线?
    • FreehandDrawTool 允许用鼠标绘制一些东西。
    猜你喜欢
    • 1970-01-01
    • 2022-10-02
    • 2017-10-20
    • 2021-01-01
    • 2023-04-04
    • 2021-02-28
    • 1970-01-01
    • 2022-01-14
    • 2022-12-03
    相关资源
    最近更新 更多