Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 绘制系列线将变为曲线_Python_Pandas_Matplotlib_Plot_Time Series - Fatal编程技术网

Python 绘制系列线将变为曲线

Python 绘制系列线将变为曲线,python,pandas,matplotlib,plot,time-series,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

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


编辑:为什么日期不能直接映射到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)

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

问题在于在
直线()
函数中计算y值的方式。您将日期视为只是分类值,而忽略日期之间的间隔。线性回归计算不会做到这一点——它会将日期视为连续值

要在示例代码中获得一条直线,您应该使用
td=(index-index[0])
(返回一个熊猫)将
index_1
中的值从绝对日期转换为相对差异,然后使用
td
中的天数作为计算的x值。我已经在下面的
reg\u 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-'])
这将生成下图:


注意:我在图形中添加了点,以明确在图形上绘制的值。如您所见,橙色线是直线,即使在该范围内的某些天没有值。

您是否试图创建一条日期间隔不均匀的直线(x轴)或者你想让日期值表现得像一个分类值?第一个图中的橙色线似乎正是你要寻找的图。有什么问题吗?要得到一条直线,你必须调整x轴,使其以与y轴相同的速率进行调整。这对于根据彼此距离不同的日期进行绘图是不起作用的。为什么你需要数据的曲线是一条直线?哦,我应该解释一下,最初的问题是一个常见的任务,将一个时间序列的回归线绘制成同一个图,带日期。回归线应该是直线。为什么日期不直接映射到数据点,比如: