的Python:简介与同一x轴的曲线图值

问题描述:

说,我有两个列表:的Python:简介与同一x轴的曲线图值

yvalues = [30, 40, -20, 0, -10, 20, 45, 12, -5, ....] 
Dates = ['20110103', '20110103', '20110103', '20110108', '20110108', '20110108', '20110113', '20110113', '20110113', ....] 

Dates第一项不对应于所述第一值在yvalues等。日期重复,因为我每5天观察多次yvalues

现在,如果我想与Dates绘制yvalues为x轴,我做的:

plt.plot(yvalues) 
plt.xticks(dates) 

它给了我一个错误。如果我尝试:plt.plot(Dates, yvalues),我得到这个讨厌的图表: enter image description here

我怎样才能在x轴上绘制正确的日期值(即20110103),并没有直线分开的观察?

UPDATE

我不希望我的价值观要在同一垂直线上的每一天,但一前一后绘制。事实上,每次观察之间有5分钟的时间差。我决定我的Dates使用列表中进行转换:

Dates = [datetime.date(int(d[0:4]), int(d[4:6]), int(d[6:8])) for d in Dates] 

然后我做的:

plt.plot(dates, yvalues) 

,并得到了以下情节:

enter image description here

显然,这张照片显示的值同一日期在同一垂直线上。我仍然有令人厌烦的直线分隔每个日期。

现在,如果我不使用任何日期为x轴,我得到如下图(这是我想要的,但我想在x轴上的日期):enter image description here

样品可用的数据集here

+0

所以你要对每一天的每个点之间的直线,但不是每一天之间,这一切都是相同的颜色?为什么不把它分成多个数据集? – will 2014-11-06 22:38:36

+0

什么是实际数据?可能有更好的方式来将其可视化。 – will 2014-11-06 22:39:05

+0

@will我更新了我想要的问题的图表,但是您会看到x轴上没有日期,否则我会以前面的(带空格的蓝色条)图表结束。我只是想在我的x轴图上添加日期。我不需要在每个点之间有任何距离,但只要每天的每个点不出现在同一个垂直线上。 – Plug4 2014-11-06 23:32:59

经过一番讨论后,下面是我最终着陆的内容;

import datetime 
import random 
import numpy as np 
import datetime 
import itertools 


dates, allSpillovers, allBins, allDigitised = [], [], [], [] 
with open("year.dat") as year: 
    previousDate = None 
    spillovers = [] 
    for line in year.readlines()[1:]: 
    _, strdate, spillover = line.split(",") 
    spillover = float(spillover) 
    year, month, day = [int(i) for i in strdate.split("-")] 

    date = datetime.date(year, month, day) 

    if previousDate == date: 
     spillovers.append(spillover) 
    elif previousDate != None: 
     mean = np.mean(spillovers) 
     stdev = np.std(spillovers) 

     spillovers.sort() 
     if len(spillovers) > 70: 
      allSpillovers.append([mean, mean-stdev, mean+stdev] + spillovers) 
      dates.append(date) 
     spillovers = [] 

    previousDate = date 



#itertools.izip_longest(*allSpillovers, fillvalue=0) 
allSpillovers = zip(*allSpillovers) 


from matplotlib import pyplot 

print len(dates), len(allSpillovers[0]), len(allSpillovers[1]) 

fig = pyplot.figure() 
ax = fig.add_subplot(1,1,1) 


for i in range(3, len(allSpillovers)-1): 
    alpha = 0.5 - abs(i/float(len(allSpillovers)) - 0.5) 
    print len(dates), len(allSpillovers[i]), len(allSpillovers[i+1]) 
    ax.fill_between(dates, allSpillovers[i], allSpillovers[i+1], facecolor='green', interpolate=True, alpha=alpha, linewidth=0) 

#ax.fill_between(dates, allSpillovers[1], allSpillovers[2], facecolor='green', interpolate=True, alpha=0.5) 

#for b, d in bins, digitised: 



ax.plot(dates, allSpillovers[0], color="blue", linewidth=2) 
ax.plot(dates, [0 for _ in dates], color="red", linewidth=2) 
ax.grid() 

fig.autofmt_xdate() 

pyplot.show() 

enter image description here

enter image description here

+0

呵呵,你打败我吧!我正在使用strptime,并且还包含了fig.autofmt_xdate()。 – Ajean 2014-11-06 20:13:47

+0

@很好的建议。我的问题应该更清楚。我不希望同一日期的值出现在同一条垂直线上,而是一个接一个地出现。事实上,每一天的观察结果之间有5分钟的距离。我会更新我的问题。 – Plug4 2014-11-06 21:18:44

+0

这太棒了!真的很感激@愿意 – Plug4 2014-11-07 04:13:16

试试这个:

>>> from matplotlib import pyplot as plt 
>>> Dates = ['20110103', '20110103', '20110103', '20110108', '20110108', '20110108', '20110113', '20110113', '20110113'] 
>>> yvalues = [30, 40, -20, 0, -10, 20, 45, 12, -5] 
>>> x=range(len(Dates)) 
>>> plt.xticks(x,Dates) 
>>> plt.plot(x,yvalues) 
>>> plt.show() 

enter image description here