【问题标题】:plot pandas dataframe two columns绘制熊猫数据框两列
【发布时间】:2017-06-09 02:51:37
【问题描述】:

我有一个 pandas 数据框,其中有日期作为索引和一些列: 我想绘制一个有 2 条线的折线图(比如说 'ISP.MI' 和 'Ctrv');在 x 轴上我需要“日期”

Ticker       ISP.MI  Daily returns        Ctrv  Inv_Am  Giac_Media
Date                                                                 
2016-01-01  2.90117            NaN  100.000000     100       100.0   
2016-01-04  2.80159      -0.034927  196.507301     200       150.0   
2016-01-05  2.85608       0.019263  300.292610     300       200.0   
2016-01-06  2.77904      -0.027345  392.081255     400       250.0   
2016-01-07  2.73206      -0.017050  485.396411     500       300.0   
2016-01-08  2.72267      -0.003443  583.725246     600       350.0   

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    如果你不关心轴比例:

    plt.figure()
    
    x = df['Date']
    y1 = df['ISP.MI']
    y2 = df['Ctrv']
    
    plt.plot(x,y1)
    plt.plot(x,y2)
    

    如果你关心它:

    fig, ax1 = plt.subplots()
    
    x = df['Date']
    y1 = df['ISP.MI']
    y2 = df['Ctrv']
    
    ax2 = ax1.twinx()
    
    ax1.plot(x, y1, 'g-')
    ax2.plot(x, y2, 'b-')
    

    【讨论】:

      【解决方案2】:

      我认为最简单的方法是按子集选择列,然后 DataFrame.plot:

      df[['ISP.MI','Ctrv']].plot()
      

      【讨论】:

      • 如何将每列的线条样式和颜色添加为列表,例如g-, ro 等。你能补充一下答案吗? @jezrael
      • @ihightower - 有多种解决方案,请查看this 答案。
      • @jezrael 有关如何保存以这种方式创建的绘图的任何想法?我使用了plt.savefig ("path/pic1.png"),它只是保存了一个空白图像。
      【解决方案3】:

      所以,这里是从头开始创建一个看起来像你的数据框并生成你要求的图的代码:

      import pandas as pd
      import datetime
      import numpy as np
      from matplotlib import pyplot as plt
      
      # The following two lines are not mandatory for the code to work
      import matplotlib.style as style
      style.use('dark_background')
      
      def create_datetime_range(numdays=10):
          """Creates the timestamp range"""
          base = datetime.datetime.today()
          datelist = pd.date_range(base, periods=numdays).to_pydatetime()
          return datelist
      def convert_to_date(datetime_list):
          """Converts a timestamp array into a date array"""
          return [x.date() for x in datetime_list]
      
      
      
      a = pd.DataFrame(
          {
              'ISP.MI': np.random.normal(2,1,10),
              'Ctrv' : np.random.normal(200,150,10)
          }, 
          index=convert_to_date(create_date_range())
      )
      a.plot()
      

      但是,我相信您的数据框在两个方面有所不同:

      1. 索引中似乎有两个级别(日期标题似乎在代码标题的第二行)。我想这可能是因为您使用了 .groupby() 或 .unstack() 或其他聚合/透视方法。我建议你查看 reset_index() 方法。

      2.您的数据框有更多您需要的列。正如@jezrael 所建议的,您应该首先只选择这些。你可以这样做:

      df[['ISP.MI','Ctrv']]
      

      然后在较小的数据帧上使用 .plot() 方法,让 pandas 处理其余部分。

      【讨论】:

        【解决方案4】:
        import numpy as np
        import pandas as pd
        import matplotlib.pyplot as plt
        
        d = {'x' : [1,2,3,4,5,6,7,8,9,10],
             'y_one' : np.random.rand(10),
             'y_two' : np.random.rand(10)}
        
        df = pd.DataFrame(d)
        
        df.plot('x',y=['y_one','y_two'])
        plt.show()
        

        【讨论】:

        • 我发现这种方法很有用,因为它展示了如何使用 plot() 从 DataFrame 中选择特定列并将指定列映射到 X 和 Y 轴。
        【解决方案5】:

        现在在最新的 pandas 中,您可以直接使用 df.plot.scatter 函数

        df = pd.DataFrame([[5.1, 3.5, 0], [4.9, 3.0, 0], [7.0, 3.2, 1],
                       [6.4, 3.2, 1], [5.9, 3.0, 2]],
                      columns=['length', 'width', 'species'])
        ax1 = df.plot.scatter(x='length',
                          y='width',
                          c='DarkBlue')
        

        https://pandas.pydata.org/pandas-docs/version/0.23/generated/pandas.DataFrame.plot.scatter.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-07
          • 2013-07-22
          • 2017-10-10
          • 2020-01-14
          • 2017-05-28
          • 2015-02-04
          • 2018-02-10
          • 2022-01-08
          相关资源
          最近更新 更多