首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:使用自动Y缩放打印烛台

Python:使用自动Y缩放打印烛台
EN

Stack Overflow用户
提问于 2018-07-04 03:54:31
回答 3查看 4.7K关注 0票数 5

我正在寻找一个Python绘图库,允许我绘制烛台(最好是OHLC条变体),通过鼠标滚轮滚动(或类似)X缩放,并在缩放时自动缩放Y轴。

作为我正在寻找的一个例子,tradingview.com完美地做到了这一点。参见https://uk.tradingview.com/chart/?symbol=NASDAQ:NDX。OHLC条可以通过单击左上角的烛台图标并选择“条”来查看。

Plotly几乎能够做到这一点。plotly.graph_objs中的Ohlc类提供了OHLC条,默认的范围滑块是X缩放的一个很好的特性(也可以很容易地启用鼠标滚轮滚动)。然而,据我所知,在Python中没有自动Y缩放功能(Y-axis autoscaling with x-range sliders in plotly),因此放大一段数据会使它看起来很平坦。示例代码- https://plot.ly/python/ohlc-charts/

我熟悉的另一个选择是PyQtGraph,它有很好的缩放功能,但不支持烛台绘图。使用它将涉及到编写我自己的candlestick对象。

有很多我不知道的Python绘图库。有没有开箱即用的支持呢?有人能提供示例代码来干净利落地做到这一点吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-29 07:02:03

以下是如何在finplot中执行此操作:

代码语言:javascript
复制
import yfinance as yf
import finplot as fplt

df = yf.download('^NDX', start='2018-01-01', end='2020-04-29')
print(df)
fplt.candlestick_ochl(df[['Open','Close','High','Low']])
fplt.show()

免责声明:我是作者。Finplot具有自动Y-scaling,使用干净的api快速且自以为是。请参阅示例here

票数 6
EN

Stack Overflow用户

发布于 2018-07-08 06:21:46

我找到的最好的解决方案是使用Bokeh。这里有一个相关的问题- Bokeh, zoom only on single axis, adjust another axis accordingly。一个答案链接了一个gist,它给出了一个设置自动Y缩放的烛台的例子。

不幸的是,这远不是一个“开箱即用”的解决方案,因为它涉及到编写一个自定义的JavaScript回调。然而,解决方案仍然相当简单。我无法运行gist上的代码,主要是因为Pandas DataReader的问题。以下是代码的更新版本,它使用了Bokeh提供的示例数据(根据Bokeh Candlesicks example),增加了与TradingView的更多相似性,并解决了我发现的其他一些问题:

代码语言:javascript
复制
import pandas as pd

from bokeh.io import output_file, show
from bokeh.plotting import figure
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.sampledata.stocks import MSFT


def candlestick_plot(df):
    fig = figure(sizing_mode='stretch_both',
                 tools="xpan,xwheel_zoom,undo,redo,reset,crosshair,save",
                 active_drag='xpan',
                 active_scroll='xwheel_zoom',
                 x_axis_type='datetime')

    inc = df.close > df.open
    dec = ~inc

    fig.segment(df.date[inc], df.high[inc], df.date[inc], df.low[inc], color="green")
    fig.segment(df.date[dec], df.high[dec], df.date[dec], df.low[dec], color="red")
    width_ms = 12*60*60*1000 # half day in ms
    fig.vbar(df.date[inc], width_ms, df.open[inc], df.close[inc], color="green")
    fig.vbar(df.date[dec], width_ms, df.open[dec], df.close[dec], color="red")

    source = ColumnDataSource({'date': df.date, 'high': df.high, 'low': df.low})
    callback = CustomJS(args={'y_range': fig.y_range, 'source': source}, code='''
        clearTimeout(window._autoscale_timeout);

        var date = source.data.date,
            low = source.data.low,
            high = source.data.high,
            start = cb_obj.start,
            end = cb_obj.end,
            min = Infinity,
            max = -Infinity;

        for (var i=0; i < date.length; ++i) {
            if (start <= date[i] && date[i] <= end) {
                max = Math.max(high[i], max);
                min = Math.min(low[i], min);
            }
        }
        var pad = (max - min) * .05;

        window._autoscale_timeout = setTimeout(function() {
            y_range.start = min - pad;
            y_range.end = max + pad;
        });
    ''')

    fig.x_range.callback = callback
    show(fig)

df = pd.DataFrame(MSFT)
df["date"] = pd.to_datetime(df["date"])
output_file("candlestick.html")
candlestick_plot(df)
票数 6
EN

Stack Overflow用户

发布于 2018-10-05 20:02:45

我一直在努力让这个点缀式的烛台图以我想要的方式工作,所以我开发了一个代码示例来分享。

这不依赖于任何额外的javascript或其他库,除了Dash、Plotly和一个名为pytz的日期库。示例代码在更新和x范围滑块时提供对yaxis范围的自动更新。Y轴设置为仅显示图表中具有两个刻度填充的条形图的价格范围。

这对我来说效果很好,我可以在图表顶部添加任意数量的跟踪覆盖。另外,我可以在本地运行它,而不必使用plotly服务。请参阅此处的gitub repo:

https://github.com/gersteing/DashCandlestickCharting/blob/master/README.md

对那些想尝试的人来说。使用Flask在本地运行。享受吧!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51162010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档