以完整日期为轴进行绘图

时间:2019-09-26 04:53:19

标签: python python-3.x plotly

我在数据的x轴方面遇到麻烦。目前,它看起来像这样。

[201909240908, 201909240956, 201909241002, ...]为YYYYMMDDHHMM格式。该图不仅是错误的(中间不应该是直线),而且很难读取。

enter image description here

如何在保留日期的同时更改我的a轴数据?理想情况下,x轴值在底部会显示为DDHHMM,而年份和月份则是隐藏的。


更新

现在显示日期好得多了。但是间隔是相等的,而不是准确的。

enter image description here

1 个答案:

答案 0 :(得分:1)

这里似乎有两个问题:

  1. 日期格式
  2. 图中的线性间距-(未解决)

日期格式: 该答案使用您的日期列表解决了日期格式问题。我们将使用pandas.DataFrame来处理数据的格式化和传递到plotly中,因为它们可以很好地协同工作。

这是带有注释的示例代码。 我模拟了值,但是日期是您的。

线性间距: 不幸的是,我无法找到一种具有日期轴的方法,在日期之间具有代表性的(非相等)间距。还有谁?但是下面的代码解决方案使您可以使用xaxis上的'type': 'category'参数将日期用作xaxis。

我还没有对输出图应用任何漂亮的格式-由您决定。 :-)

import pandas as pd
import numpy as np
import plotly.graph_objs as go
from plotly.offline import plot

# Builing date range from yours.
dates = [201909240908, 201909240956, 201909241002, 201909241056, 201909241113, 201909241156, 
         201909241200, 201909241227, 201909241256, 201909241301, 201909241356, 201909241456, 
         201909241547, 201909241556, 201909241648, 201909241656, 201909241704, 201909241756, 
         201909241936, 201909241956, 201909242008, 201909242056, 201909242151, 201909242156, 
         201909242218, 201909242256, 201909242315, 201909242356, 201909250041, 201909250056, 
         201909250057, 201909250156, 201909250200, 201909250256, 201909250356, 201909250400, 
         201909250456, 201909250556, 201909250656, 201909250756, 201909250856, 201909250956, 
         201909251056, 201909251156, 201909251256, 201909251356]
# Simulate values.
values = np.random.randint(250, 350, len(dates)).tolist()

# Add dates and values to a DataFrame.
df = pd.DataFrame({'Dates': dates, 'Values': values})
# Format your dates.
df['Dates'] = pd.to_datetime(dates, format='%Y%m%d%H%M').strftime('%Y-%d-%m %H:%M')

# Create plot.
trace = go.Scatter(x=df['Dates'], y=df['Values'])
layout = {}
layout.update({'xaxis': {'type': 'category'}})
layout.update({'yaxis': {'range': [0, 400]}})
fig = {'data': [trace], 'layout': layout}
plot(fig)

日期格式替代: 将日期转换为datetime对象列表(并保留DataFrame)的另一种方法是:

datesf = [pd.datetime.strptime(str(date), "%Y%m%d%H%M") for date in dates] 

这将返回:

[datetime.datetime(2019, 9, 24, 9, 8), datetime.datetime(2019, 9, 24, 9, 56), ... ]