【问题标题】:How do you plot a vertical line on a time series plot in Pandas?如何在 Pandas 的时间序列图上绘制垂直线?
【发布时间】:2013-10-13 08:58:52
【问题描述】:
  • 如何在 Pandas 系列图中绘制一条垂直线 (vlines)?
  • 我正在使用 Pandas 绘制滚动方式等,想用竖线标记重要位置。
  • 是否可以使用vlines 或类似的东西来完成此操作?
  • 在这种情况下,x 轴是datetime

【问题讨论】:

    标签: python matplotlib plot pandas


    【解决方案1】:
    plt.axvline(x_position)
    

    它采用标准绘图格式选项(linestlyecolor 等)

    (doc)

    如果您引用了您的 axes 对象:

    ax.axvline(x, color='k', linestyle='--')
    

    【讨论】:

    • 是的,您可以访问轴对象 ax = s.plot(),其中 s 是 pandas.Series
    【解决方案2】:

    如果您有时间轴,并且将 Pandas 导入为 pd,则可以使用:

    ax.axvline(pd.to_datetime('2015-11-01'), color='r', linestyle='--', lw=2)
    

    对于多行:

    xposition = [pd.to_datetime('2010-01-01'), pd.to_datetime('2015-12-31')]
    for xc in xposition:
        ax.axvline(x=xc, color='k', linestyle='-')
    

    【讨论】:

    • 我有一个为期 3 天的情节,我所做的只是:xposition = [pd.to_datetime('01/04/2016'), pd.to_datetime('02/04/2016'),pd.to_datetime('03/04/2016')] 然后for xc in xposition: ax.axvline(x=xc, color='k', linestyle='-')。我得到了:ValueError: ordinal must be >= 1.。怎么了?
    • @FaCoffee,您的日期格式与答案中给出的示例不同,但我看不出这会有什么不同。
    • 我想在每天的时间序列列图上绘制一条垂直线,请帮忙?
    • 如何在这一行添加标签?或者如何把这条线放到图例上?
    【解决方案3】:

    DataFrame 绘图函数返回AxesSubplot 对象,您可以在其上添加任意数量的行。看看下面的代码示例:

    %matplotlib inline
    
    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(index=pd.date_range("2019-07-01", "2019-07-31"))  # for sample data only
    df["y"] = np.logspace(0, 1, num=len(df))  # for sample data only
    
    ax = df.plot()
    # you can add here as many lines as you want
    ax.axhline(6, color="red", linestyle="--")
    ax.axvline("2019-07-24", color="red", linestyle="--")
    

    【讨论】:

      【解决方案4】:

      matplotlib.pyplot.vlines

      • 对于时间序列,轴的日期必须是正确的日期时间对象,而不是字符串。
      • 允许单个或多个位置
      • ymin & ymax 被指定为特定的 y 值,而不是 ylim 的百分比
      • 如果用fig, axes = plt.subplots() 之类的东西引用axes,则将plt.xlines 更改为axes.xlines

      plt.plot() & sns.lineplot()

      from datetime import datetime
      import pandas as pd
      import numpy as np
      import matplotlib.pyplot as plt
      import seaborn as sns  # if using seaborn
      
      plt.style.use('seaborn')  # these plots use this style
      
      # configure synthetic dataframe
      df = pd.DataFrame(index=pd.bdate_range(datetime(2020, 6, 8), freq='1d', periods=500).tolist())
      df['v'] = np.logspace(0, 1, num=len(df))
      
      # plot
      plt.plot('v', data=df, color='magenta')
      
      y_min = df.v.min()
      y_max = df.v.max()
      
      plt.vlines(x=['2020-07-14', '2021-07-14'], ymin=y_min, ymax=y_max, colors='purple', ls='--', lw=2, label='vline_multiple')
      plt.vlines(x=datetime(2021, 9, 14), ymin=4, ymax=9, colors='green', ls=':', lw=2, label='vline_single')
      plt.legend(bbox_to_anchor=(1.04, 0.5), loc="center left")
      plt.show()
      

      df.plot()

      df.plot(color='magenta')
      
      ticks, _ = plt.xticks()
      print(f'Date format is pandas api format: {ticks}')
      
      y_min = df.v.min()
      y_max = df.v.max()
      
      plt.vlines(x=['2020-07-14', '2021-07-14'], ymin=y_min, ymax=y_max, colors='purple', ls='--', lw=2, label='vline_multiple')
      plt.vlines(x='2020-12-25', ymin=y_min, ymax=8, colors='green', ls=':', lw=2, label='vline_single')
      plt.legend(bbox_to_anchor=(1.04, 0.5), loc="center left")
      plt.show()
      

      软件包版本

      import matplotlib as mpl
      
      print(mpl.__version__)
      print(sns.__version__)
      print(pd.__version__)
      
      [out]:
      3.3.1
      0.10.1
      1.1.0
      
      

      【讨论】: