highcharts 如何从财务图表的X轴中删除周末日期时间间隔?

wko9yo5t  于 2022-11-10  发布在  Highcharts
关注(0)|答案(6)|浏览(147)

我有一个使用案例,其中我以ask and bid的形式在图形上提取和绘制Forex数据,这是基于minute, hour or day candlesticks的,我只将bid and askclosing值绘制为spline

问题

我正在使用其Forex数据馈送的端点从Friday 8pmSunday 9pm不可用。

  • 在图表上一次绘制200个数据点(即每小时蜡烛线),在新蜡烛线上逐步淘汰最旧的,并绘制最新的
  • X轴是UTC ISO Format中数据点的datetime
  • Y轴是卖出价和买入价的值
  • 一次曲线图显示4.1 days worth of hourly candle

x-axis上的datetime没有任何间隔时,图形为prettysmooth

2018-06-29T16:00:00.000000000Z
2018-06-29T17:00:00.000000000Z
2018-06-29T19:00:00.000000000Z
2018-06-29T20:00:00.000000000Z (Friday last candle 8pm)
2018-07-01T21:00:00.000000000Z (Sunday first candle 9pm) 
2018-07-01T22:00:00.000000000Z
2018-07-01T23:00:00.000000000Z
2018-07-02T00:00:00.000000000Z

一旦出现间隙(大约47-49 hours),所有内容都会被压缩,以适应图形的拉伸部分,如下所示(使用plotly.js

大多数情况下,财务图表不会显示差距。例如,查看TradingView交互式图表,您将看到weekend的以下内容

如果你知道如何用开源图表库(不包括TradingView)解决这个问题,那么请分享你的解决方案。

tf7tbtn2

tf7tbtn21#

TL;DR

根据我的发现,你可以使用Highcharts库的HighStock来排除这些差距。Highcharts是开源的,并且只对Non-commercial免费使用,更多详细信息请参见highcharts licensing

情节. js

我最初是从plotly.js开始的,因为老实说,它确实是一个非常好的图表库。
论坛(论坛)
https://github.com/plotly/plotly.js/issues/1382(锁定的github线程)
https://community.plot.ly/t/x-axis-without-weekends/1091/2
根据上面的Github问题链接,目前无法在x-axis上处理datetime。有一些变通办法(如上面的第三个链接),但我尝试了一些,要么不起作用,要么我丢失了一些信息。
我得出的结论是,尽管plotly是一个很棒的库,但它在这种情况下根本无法帮助我。如果你认为它能帮助我,请分享你的解决方案:)
C3.js中的一个
在对图表库做了更多的研究之后,我给予了一下C3.js,在用datetime编辑了他们的x轴实时演示示例之后,我观察到了同样的周末间隙问题(见下文)

我没有费心去研究为什么,这可能是因为基于D3.js就像plotly.js一样。如果你认为日期时间间隔可以用C3.js来处理,那么请随时分享你的解决方案。

高排行榜

我终于遇到了Highxxxxx图表库的家族,乍一看,它看起来很漂亮,提供了我想要的所有功能。我尝试了Highchart,我得到了同样的周末间隙问题

我开始想,唯一的解决方案就是在x-axis中显示datetime,然后以某种方式在tooltip中显示日期时间,这样似乎就完成了任务,如下所示

但是,由于太固执而不能给予,我继续了我的研究。我真的很想完成图表,如X11 M19 N1 X和其他股票可视化。
我决定做一些更多的研究,我不知道我是如此如此接近一个解决方案,由非常相同的图表库Highcharts,它被称为HighStock
高牌股票
默认情况下,HighStock会处理间隙,如下所示

我使用了下面的Javascript

Highcharts.setOptions({
    global: {
      useUTC: false
    }
  });

  Highcharts.StockChart('chart', {
    chart: {
        type: 'spline',
        events: {
            load: function () {
              console.log('Highcharts is Loaded! Creating a reference to Chart dom.')

              //store a reference to the chart to update the data series
              var index=$("#chart").data('highchartsChart');
              highchartRef = Highcharts.charts[index]; //global var

              //Initiating the data pull here
            }
        }
    },
    title: {
        text: 'Chart title'
    },
    series: [
      {
        name: 'Ask',
        data: [],
        tooltip: {
            valueDecimals: 7
        },
        marker: {
          enabled: true
        }
      },
      {
        name: 'Bid',
        data: [],
        tooltip: {
            valueDecimals: 7
        },
        marker: {
          enabled: true
        }
      }
    ]
  });

这是一个无缝的(不确定它是否是一真实的单词)财务图表,x轴为datetime,表示财务数据。

我没有尝试的库

我已经研究过,但没有尝试过以下图表库

  • Google排行榜(感觉不对,原因不明)
  • 图表师(没有看到太多的交互性和金融相关的图表类型和示例
  • 图表(与图表作者相同)
  • TradingView(我在阅读了他们的使用条款后给予-怪异的条款,我的观点)
  • 其他大多数人缺乏文档,交互性,财务相关的图表,如PlotlyHighcharts的水平。

最后的想法
我发现Highcharts
1.记录完善
1.大量的jsfiddles示例
1.很多有用的SO答案
1.美观实用
1.多种选择
1.易于使用

gaps相关的类似SO问题

How can I hide data gaps in plotly?
HighCharts datetime xAxis without missing values (weekends)( highcharts )
Remove weekend gaps in gnuplot for candlestick chart(阴阳烛图,枪形图)
How to remove gaps in C3 timeseries chart?(c3/d3 -小提琴不工作,所以很难看到解决方案)
How to remove weekends dates from x axis in dc js chart(c3.js -差距是某个间隙)

6qftjkof

6qftjkof2#

Plotly现在支持隐藏周末和假期图表与rangebreaks的帮助.检查此链接:https://plotly.com/python/time-series/转到“隐藏周末和节假日”部分
以下是从该链接复制的部分,示例适用于plotly.express,但也适用于plotly.graph_objects

隐藏周末和假日日期类型的x轴和y轴上可用的分段范围属性可用于隐藏某些时段。在下面的示例中,我们显示了两个图:一个在默认模式下显示数据中的间隙,另一个隐藏了周末和节假日以显示不间断的交易历史。注意12月21日和1月4日网格线之间的间隙较小,其中节假日被删除。查看参考以了解更多选项:https://plotly.com/python/reference/#layout-xaxis-rangebreaks

import plotly.express as px
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')

fig = px.scatter(df, x='Date', y='AAPL.High', range_x=['2015-12-01', '2016-01-15'],
                 title="Default Display with Gaps")
fig.show()

无间隙显示

import plotly.express as px
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')

fig = px.scatter(df, x='Date', y='AAPL.High', range_x=['2015-12-01', '2016-01-15'],
                 title="Hide Gaps with rangebreaks")
fig.update_xaxes(
    rangebreaks=[
        dict(bounds=["sat", "mon"]), #hide weekends
        dict(values=["2015-12-25", "2016-01-01"])  # hide Christmas and New Year's
    ]
)
fig.show()

gcuhipw9

gcuhipw93#

根据文件
尝试在fig.show()之前添加

fig.update_xaxes(
    rangebreaks=[
        dict(bounds=["sat", "sun"]), #hide weekends
    ]
)

fig.layout.xaxis.type = 'category'
kyvafyod

kyvafyod4#

使用category作为xaxis类型对我来说非常有效(注意go.layout对象):

import plotly.graph_objects as go

    layout = go.Layout(
        xaxis=dict(
            type='category',
        )
    )

    fig = go.Figure(data=[go.Candlestick(x=self.price_df.index.to_series(),
                                         open=self.price_df[e.OHLCV.OPEN.value],
                                         high=self.price_df[e.OHLCV.HIGH.value],
                                         low=self.price_df[e.OHLCV.LOW.value],
                                         close=self.price_df[e.OHLCV.CLOSE.value])],
                    layout=layout)

    fig.show()
44u64gxh

44u64gxh5#

首先,不需要放弃Plotly。使用范围分隔符确实是要使用的工具,但这只是它的一个方面。我这样说是因为对于股票数据来说,与值相比,范围是不实际的,但您将为每年的许多假期指定日期。并且它们中的大多数在不同的年份之间会发生变化。因此,使用值作为范围分隔符,并将您不需要的每个日期的列表输入其中。如果你需要一个更大的推动来解决这个问题,我的意思是把'日期'列放在一边,循环通过它,并追加在另一个列表中没有的日期。然后你可以去***fig.update_xaxes(rangebreaks=[dict(values=mylistofdates)])***希望这能把你带回Plotly!

zphenhs4

zphenhs46#

要使用plotly从Financial Data中删除空列(如Weekends),请使用以下代码。
代码-

import plotly.express as px

# Daily Percentage change in Nifty 50 Index

daily_returns = np.log(1+df_close.pct_change())*100

fig = px.bar(daily_returns,y = "Close", orientation='v')
fig.update_xaxes( rangeslider_visible=True, rangebreaks=[
        dict(bounds=["sat", "mon"]), #hide weekends
    ])
fig.update_layout(
    title='Nifty 50 Daily Returns in %',
    yaxis_title='Daily % Change')
fig.update_layout( xaxis_tickformat = ' %d %B (%a)<br> %Y')

fig.show()

啪-

相关问题