'Plotly: How to style a plotly figure so that it doesn't display gaps for missing dates?

I have a plotly graph of the EUR/JPY exchange rate across a few months in 15 minute time intervals, so as a result, there is no data from friday evenings to sunday evenings.

Here is a portion of the data, note the skip in the index (type: DatetimeIndex) over the weekend: enter image description here

Plotting this data in plotly results in a gap over the missing dates Using the dataframe above:

import plotly.graph_objs as go
candlesticks = go.Candlestick(x=data.index, open=data['Open'], high=data['High'],
                   low=data['Low'], close=data['Close'])
fig = go.Figure(layout=cf_layout)
fig.add_trace(trace=candlesticks)
fig.show()

Ouput:

enter image description here

As you can see, there are gaps where the missing dates are. One solution I've found online is to change the index to text using:

data.index = data.index.strftime("%d-%m-%Y %H:%M:%S")

and plotting it again, which admittedly does work, but has it's own problem. The x-axis labels look atrocious:

enter image description here

I would like to produce a graph that plots a graph like in the second plot where there are no gaps, but the x-axis is displayed like as it is on the first graph. Or at least displayed in a much more concise and responsive format, as close to the first graph as possible.

Thank you in advance for any help!



Solution 1:[1]

Just in case someone here wants to remove gaps for outside trading hours and weekends, As shown below, using rangebreaks is the way to do it.

    fig = go.Figure(data=[go.Candlestick(x=df['date'], open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'])])
    fig.update_xaxes(
        rangeslider_visible=True,
        rangebreaks=[
            # NOTE: Below values are bound (not single values), ie. hide x to y
            dict(bounds=["sat", "mon"]),  # hide weekends, eg. hide sat to before mon
            dict(bounds=[16, 9.5], pattern="hour"),  # hide hours outside of 9.30am-4pm
            # dict(values=["2020-12-25", "2021-01-01"])  # hide holidays (Christmas and New Year's, etc)
        ]
    )
    fig.update_layout(
        title='Stock Analysis',
        yaxis_title=f'{symbol} Stock'
    )

    fig.show()

here's Plotly's doc.

Solution 2:[2]

thanks for the amazing sample! works on daily data but with intraday / 5min data rangebreaks only leave one day on chart

    # build complete timepline 
    dt_all = pd.date_range(start=df.index[0],end=df.index[-1], freq="5T")
    # retrieve the dates that ARE in the original datset
    dt_obs = [d.strftime("%Y-%m-%d %H:%M:%S") for d in pd.to_datetime(df.index, format="%Y-%m-%d %H:%M:%S")]
    # define dates with missing values
    dt_breaks = [d for d in dt_all.strftime("%Y-%m-%d %H:%M:%S").tolist() if not d in dt_obs]

Solution 3:[3]

To fix problem with intraday data, you can use the dvalue parameter of rangebreak with the right ms value. For example, 1 hour = 3.6e6 ms, so use dvalue with this value.

Documentation here : https://plotly.com/python/reference/layout/xaxis/

fig.update_xaxes(rangebreaks=[dict(values=dt_breaks, dvalue=3.6e6)])

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 ville.konsala
Solution 3 Dharman