我正在尝试将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()
答案 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"
输出:
注意:如果您不使用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)
答案 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")