首页 > 解决方案 > Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙?

问题描述

我有一个以 15 分钟为间隔的几个月的欧元/日元汇率图表,因此没有从周五晚上到周日晚上的数据。

这是部分数据,注意周末索引中的跳过(类型:DatetimeIndex): 在此处输入图像描述

以 plotly 绘制此数据会导致缺失日期的差距使用上面的数据框:

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()

输出:

在此处输入图像描述

如您所见,缺少日期的地方存在空白。我在网上找到的一种解决方案是使用以下方法将索引更改为文本:

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

并再次绘制它,这确实有效,但有它自己的问题。x 轴标签看起来很糟糕:

在此处输入图像描述

我想生成一个图形,该图形绘制第二个图中没有间隙的图形,但 x 轴的显示方式与第一个图形上的一样。或者至少以更简洁和响应式的格式显示,尽可能接近第一个图表。

预先感谢您的任何帮助!

标签: pythonplotlytimeserieschart

解决方案


即使您的数据集中缺少某些日期,绘图也会将您的日期解释为日期值,并在您的时间轴上显示甚至丢失的日期。一种解决方案是获取第一个和最后一个日期,构建完整的时间线,找出原始数据集中缺少哪些日期,并将这些日期包含在:

fig.update_xaxes(rangebreaks=[dict(values=dt_breaks)])

这将变成这个数字:

在此处输入图像描述

进入这个:

在此处输入图像描述

完整代码:

import plotly.graph_objects as go
from datetime import datetime
import pandas as pd
import numpy as np

# sample data
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')

# remove some dates to build a similar case as in the question
df = df.drop(df.index[75:110])
df = df.drop(df.index[210:250])
df = df.drop(df.index[460:480])

# build complete timepline from start date to end date
dt_all = pd.date_range(start=df['Date'].iloc[0],end=df['Date'].iloc[-1])

# retrieve the dates that ARE in the original datset
dt_obs = [d.strftime("%Y-%m-%d") for d in pd.to_datetime(df['Date'])]

# define dates with missing values
dt_breaks = [d for d in dt_all.strftime("%Y-%m-%d").tolist() if not d in dt_obs]

# make fiuge
fig = go.Figure(data=[go.Candlestick(x=df['Date'],
                open=df['AAPL.Open'], high=df['AAPL.High'],
                low=df['AAPL.Low'], close=df['AAPL.Close'])
                      ])

# hide dates with no values
fig.update_xaxes(rangebreaks=[dict(values=dt_breaks)])

fig.update_layout(yaxis_title='AAPL Stock')

fig.show()

推荐阅读