在matplotlib时间序列图上叠加复杂阶跃函数代码
[ 1, 2],
[ 1, 3],
[ 1, 4]
dataArray[3,Minor_trend_matrix[:,1]]
有没有人遇到过在使用step函数 pyplot.step(x,y) 时,x值是用日期时间(datetime)表示的情况???我可以很容易地绘制这个函数,但当我用日期时间序列作为x值时就有问题了。
我有一个矩阵,大概长这样:
In [3]: Minor_trend_matrix[0:20]
Out[3]:
matrix([[ 0, 1],
[ 1, 2],
[ 1, 3],
[ 1, 4],
[-1, 5],
[ 0, 6],
[ 1, 7],
[ 2, 8],
[ 0, 9],
[ 1, 10],
[ 1, 11],
[ 1, 12],
[ 1, 13],
[ 1, 14],
[-1, 15],
[-1, 16],
[-1, 17],
[ 1, 18],
[ 1, 19],
[-1, 21]])
注意,第一列只有-2、-1、0、1、2这些数字。这些数字代表了step函数需要执行的不同操作;
- -2表示高点到低点的范围
- -1表示低点的范围
- 0表示不做任何操作
- 1表示低点到高点的范围
- 2表示低点到高点的范围,然后再回到低点
这些索引是指日期时间对象。我觉得这就是step函数出问题的地方。希望能得到一些建议或替代方案。
另外,关于这些数字所代表的具体操作,你觉得如果我只想在发生变化之前的最后一个项目上执行操作(不包括0),我是否应该删除所有在相关项目之前的条目(也就是在这个例子中,-1、2、-2之前的条目)?如果是的话,我该怎么做呢??
另外,任何关于实现这个目标的代码帮助也会很感激。
# Package Imports
import csv
import datetime
import matplotlib.pyplot as plt
import numpy as np
import dateutil.relativedelta as rd
import bisect
import scipy as sp
## File Settings
ipath = "/home/kane/Downloads/Charts/Wheat/W2/"
fname = "W2_0_L1N.CSV"
dateList = []
openList = []
highList = []
lowList = []
closeList = []
x = []
g = []
portfolio_list = []
result = []
portfolio = csv.DictReader(open(ipath + fname, "rb"))
portfolio_list.extend(portfolio)
for data in portfolio_list:
dateList.append(data['Date'])
openList.append(data[' Open'])
highList.append(data[' High'])
lowList.append(data[' Low'])
closeList.append(data[' Close'])
for item in dateList:
d = datetime.datetime.strptime(item, '%Y%m%d')
t = d.toordinal()
x.append(d)
g.append(t)
dataArray = np.asarray([x, openList, highList, lowList, closeList])
dataArrayOrd = np.array([g, openList, highList, lowList, closeList],
dtype = float)
代码的绘图部分如下:
# Plot settings
fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(111)
line0 = plt.plot(x, simple_slope, 'k', label = "High Slope")
line1 = plt.plot(x, dataArray[1,:], 'g', label = "Open")
line2 = plt.plot(x, dataArray[2,:], 'r', label = "High")
line3 = plt.plot(x, dataArray[3,:], 'y', label = "Low")
line4 = plt.plot(x, dataArray[4,:], 'b', label = "Close")
lns = line0 + line1 + line2 + line3 + line4
labs = [l.get_label() for l in lns]
ax.legend(lns,
labs,
loc='upper left',
frameon = False,
shadow=False,
fancybox=False,
labelspacing=0.1,
ncol=4,
prop={'size':9}
)
ax.set_title(fname , fontsize = 12)
plt.xticks(fontsize = 8)
plt.yticks(fontsize = 8)
ax.set_ylabel( 'Cents', fontsize = 10 )
ax.grid()
plt.show()
这个图的x轴是时间,所以x值是日期时间,step函数应该这样工作:
plt.step(x[Minor_trend_matrix[:,1]],dataArray[2,Minor_trend_matrix[:,1]])
当然,具体问题要复杂一些,需要在step函数的垂直线应该向下移动到范围的低点时访问一些值,甚至在需要同时访问高点和低点或低点再到高点时会更复杂。这就需要开发正确的条件语句。不过,目前的问题是要先让一个简单的版本在日期时间值上正常工作,才能继续进行。
1 个回答
1
解决方案:
我已经解决了这个问题,问题出在步进函数的使用上。我需要通过一个循环来生成日期时间对象。现在我可以得到一个简单的版本,接近我想要实现的效果。
# Package Imports
import csv
import datetime
import matplotlib.pyplot as plt
import numpy as np
import dateutil.relativedelta as rd
import bisect
import scipy as sp
## File Settings
ipath = "/home/kane/tripkane_python/"
fname = "datetime_test_data.csv"
portfolio_list = []
dateList = []
valueList = []
x = []
portfolio = csv.DictReader(open(ipath + fname, "rb"))
portfolio_list.extend(portfolio)
for data in portfolio_list:
dateList.append(data['date'])
valueList.append(data[' value'])
for item in dateList:
d = datetime.datetime.strptime(item, '%Y%m%d')
t = d.toordinal()
x.append(d)
dataArray = np.asarray([x, valueList])
stepList = [0, 3, 5]
TIda = []
TIv = []
for n in range(0, len(stepList)):
TIda.append(x[stepList[n]])
TIv.append(valueList[stepList[n]])
# Plot
fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(111)
line1 = plt.plot(x, valueList, 'b')
lns = line1
labs = [l.get_label() for l in lns]
ax.legend(lns,
labs,
loc='upper left',
frameon = False,
shadow=False,
fancybox=False,
labelspacing=0.1,
ncol=4,
prop={'size':9}
)
ax.set_title(fname , fontsize = 12)
plt.xticks(fontsize = 8)
plt.yticks(fontsize = 8)
ax.set_ylabel( 'Cents', fontsize = 10 )
ax.grid()
plt.step(TIda, TIv, 'r')
plt.show()
现在的问题是如何写出合适的条件语句来实现我的目标。