绘制不同频率的时间数据(matplotlib,pandas)

时间:2018-05-07 01:48:14

标签: python python-3.x pandas matplotlib time-series

我正在尝试将Pandas时间序列和多个垂直线段(标记)组合在同一个图中。该系列的频率为“Q-DEC”(四分之一),在此示例中是从日期推断出来的,但实际问题是数据集的一部分。标记通常不与系列对齐,可能出现在任何地方,不一定在四分之一的末尾。

我的问题是,如果我首先绘制系列,然后是标记,则标记的位置会四舍五入到该季度的下一个末尾(上图)。如果我首先绘制标记,然后是系列,则标记位于正确的位置,但x刻度标签不合适(较低的绘图)。

:如何在时间序列图上绘制正确位置的标记?

import datetime
import pandas as pd
from pandas import Timestamp
import matplotlib.pyplot as plt

data = pd.DataFrame({0: {Timestamp('2017-03-31'): 1, 
                         Timestamp('2017-06-30'): 2, 
                         Timestamp('2017-09-30'): 3, 
                         Timestamp('2017-12-31'): 3, 
                         Timestamp('2018-03-31'): 2, 
                         Timestamp('2018-06-30'): 1}})

ax = plt.subplot(2,1,1)
data[0].plot(ax=ax,style="-mo")
ax.axvline(pd.Timestamp(datetime.date(2017, 7, 1)), c='r')
ax.axvline(pd.Timestamp(datetime.date(2017, 8, 10)), c='g')
ax.axvline(pd.Timestamp(datetime.date(2017, 9, 20)), c='b')
ax.axvline(pd.Timestamp(datetime.date(2017, 11, 30)), c='k')
ax = plt.subplot(2,1,2)
ax.axvline(pd.Timestamp(datetime.date(2017, 7, 1)), c='r')
ax.axvline(pd.Timestamp(datetime.date(2017, 8, 10)), c='g')
ax.axvline(pd.Timestamp(datetime.date(2017, 9, 20)), c='b')
ax.axvline(pd.Timestamp(datetime.date(2017, 11, 30)), c='k')
data[0].plot(ax=ax,style="-mo")
plt.show()

Example

2 个答案:

答案 0 :(得分:2)

如果您将日期作为PeriodIndex移至索引中,请从//index.js export { default } from './Tabs' export { default as Tab } from './Tab' //Tab.js export default class Tab extends Component { render() => 'Something' } 开始,以确保正确绘制线条。
然后用设置为<div class="form-group" [class.has-error]="fullnameControl.invalid && (fullnameControl.dirty || fullnameControl.touched)" [class.has-success]="fullnameControl.valid"> <label class="control-label">Full Name Field </label> <input type="text" required class="form-control" name="fullname" id="fullname" [(ngModel)]="fullname" #fullnameControl="ngModel" /> <span class="help-block" *ngIf="fullnameControl.invalid && (fullnameControl.dirty || fullnameControl.touched)">Full Name is required. </span> </div> 的索引值替换刻度。

freq="M"

现在重置滴答声:

freq="Q-DEC"

输出:

enter image description here

注意:如果您不使用data.set_index(pd.PeriodIndex(data.index, freq="M"), inplace=True) ax = data[0].plot(style="-mo") ax.axvline(pd.Timestamp(datetime.date(2017, 7, 1)), c='r') ax.axvline(pd.Timestamp(datetime.date(2017, 8, 10)), c='g') ax.axvline(pd.Timestamp(datetime.date(2017, 9, 20)), c='b') ax.axvline(pd.Timestamp(datetime.date(2017, 11, 30)), c='k') 删除次要标记,则会与原始的每月标记和新的季度标记重叠。

<强>更新
如果您确实需要在示例中获得完全格式,那么您需要对主要和次要刻度位置和格式进行一些操作:

q_ticks = data.index.asfreq("Q-DEC")
ax.minorticks_off()
ax.set_xticks(q_ticks)
ax.set_xticklabels(q_ticks)

enter image description here

答案 1 :(得分:1)

以下代码可以像第一个子图一样更改第二个子图轴。如果您希望将四分之一作为x轴,请尝试使用它。

data = pd.DataFrame({0: {Timestamp('2017-03-31'): 1, 
                         Timestamp('2017-06-30'): 2, 
                         Timestamp('2017-09-30'): 3, 
                         Timestamp('2017-12-31'): 3, 
                         Timestamp('2018-03-31'): 2, 
                         Timestamp('2018-06-30'): 1}})

xaxis = ['Q{}'.format((pd.to_datetime(date).month-1)//3+1) for date in data.index.values]
plt.xticks(data.index.values,xaxis)

plt.axvline(pd.Timestamp(datetime.date(2017, 7, 1)), c='r')
plt.axvline(pd.Timestamp(datetime.date(2017, 8, 10)), c='g')
plt.axvline(pd.Timestamp(datetime.date(2017, 9, 20)), c='b')
plt.axvline(pd.Timestamp(datetime.date(2017, 11, 30)), c='k')
data[0].plot(style="-mo")

<强>输出 enter image description here