绘制大熊猫系列线变得弯曲

时间:2017-04-23 21:53:28

标签: python pandas matplotlib plot time-series

问题是绘制一条日期分布不均匀的直线。使用系列值数据可以修复弯曲问题,但会丢失时间轴(日期)。有办法解决这个问题吗?

编辑:为什么日期不直接映射到x轴上的刻度:

0 -> 2017-02-17,
1 -> 2017-02-20,
... ?

现在橙色线似乎有12个滴答,但只有8个数据点。

import pandas as pd
import matplotlib.pyplot as plt

def straight_line(index):  
  y = [3 + 2*x for x in range(len(index))] 
  zserie = pd.Series(y, index=index)

  return zserie

if __name__ == '__main__':

  start = '2017-02-10'
  end = '2017-02-17'
  index = pd.date_range(start,end)

  index1 = pd.DatetimeIndex(['2017-02-17', '2017-02-20', '2017-02-21', '2017-02-22',
               '2017-02-23', '2017-02-24', '2017-02-27', '2017-02-28',],
              dtype='datetime64[ns]', name='pvm', freq=None)   

  plt.figure(1, figsize=(8, 4))  

  zs = straight_line(index)
  zs.plot()

  zs = straight_line(index1)
  zs.plot()

  plt.figure(2, figsize=(8, 4))  

  zs = straight_line(index1) 
  plt.plot(zs.values)

Curvy line example Straight line with zs.values

1 个答案:

答案 0 :(得分:1)

图表正确地将日期视为连续变量。 index_1 的日期应绘制在17,20,21,22,23,24,27和28的x坐标处。因此,带橙色线的图形是正确的。

问题在于您计算straight_line()函数中y值的方式。您将日期视为仅仅是分类值并忽略日期之间的差距。线性回归计算不会这样做 - 它会将日期视为连续值。

要在示例代码中获得一条直线,您应该使用index_1(返回一个pandas TimedeltaIndex)将td = (index - index[0])中的值从绝对日期转换为相对差异,然后使用td的天数,用于计算的x值。我已经在下面的reg_line()函数中展示了如何执行此操作:

import pandas as pd
import matplotlib.pyplot as plt

def reg_line(index):
    td = (index - index[0]).days  #array containing the number of days since the first day
    y = 3 + 2*td
    zserie = pd.Series(y, index=index)
    return zserie

if __name__ == '__main__':

  start = '2017-02-10'
  end = '2017-02-17'
  index = pd.date_range(start,end)

  index1 = pd.DatetimeIndex(['2017-02-17', '2017-02-20', '2017-02-21', '2017-02-22',
               '2017-02-23', '2017-02-24', '2017-02-27', '2017-02-28',],
              dtype='datetime64[ns]', name='pvm', freq=None)   

  plt.figure(1, figsize=(8, 4))  

  zs = reg_line(index)
  zs.plot(style=['o-'])

  zs = reg_line(index1)
  zs.plot(style=['o-'])

产生下图:

Regression Lines with Date Axis

注意:我已经在图表中添加了点,以便清楚地在图上绘制了哪些值。如您所见,即使该范围内的某些天没有值,橙色线也是直的。