【问题标题】:Plotting multiple lines, in different colors, with pandas dataframe使用 pandas 数据框以不同颜色绘制多条线
【发布时间】:2015-05-27 19:15:51
【问题描述】:

我有一个如下所示的数据框

   color  x   y
0    red  0   0
1    red  1   1
2    red  2   2
3    red  3   3
4    red  4   4
5    red  5   5
6    red  6   6
7    red  7   7
8    red  8   8
9    red  9   9
10  blue  0   0
11  blue  1   1
12  blue  2   4
13  blue  3   9
14  blue  4  16
15  blue  5  25
16  blue  6  36
17  blue  7  49
18  blue  8  64
19  blue  9  81

我最终想要两条线,一条蓝色,一条红色。红线本质上应该是 y=x,蓝线应该是 y=x^2

当我执行以下操作时:

df.plot(x='x', y='y')

输出是这样的:

有没有办法让熊猫知道有两个集合?并对它们进行相应的分组。我希望能够将列 color 指定为集微分器

【问题讨论】:

    标签: python pandas plot


    【解决方案1】:

    最通用的方法是根据color 组绘制不同的颜色。也就是说,我们使用Dataframe.groupby 对颜色进行分组,然后在相关轴上绘制数据。

    例如

    import numpy as np, pandas as pd, matplotlib.pyplot as plt
    n = 1000
    xy = np.random.rand(n,  2) + np.random.rand(n)[:, None]
    color = np.random.randint(0, 3, size = n)
    data = dict(x = xy[:, 0], y = xy[:, 1], color = color)
    df = pd.DataFrame(data)
    
    fig, ax = plt.subplots()
    for labels, dfi in df.groupby("color"):
        dfi.plot(ax = ax, x = 'x', y = 'y', label = labels)
    ax.legend(title = 'color')
    fig.show()
    

    【讨论】:

      【解决方案2】:

      您也可以尝试使用以下代码使用 pandas 数据框绘制不同颜色的多条线。

      import matplotlib.pyplot as plt
      import matplotlib as mpl
      import numpy as np
      from pandas import DataFrame
      
      value1 = [10, 20, 30, 40, 50] 
      value2 = [5, 10, 15, 20, 25]
      value3 = [8, 9, 10, 15, 20]
      
      results1 = DataFrame({'SAC': value1, 'TD3': value2, 'DDPG': value3})
      
      results1.plot()
      plt.legend(loc='lower right')
      plt.xlabel("Episode")
      plt.ylabel("Rewards")
      plt.show()
      

      输出:

      【讨论】:

        【解决方案3】:

        另一种简单的方法是使用pandas.DataFrame.pivot 函数来格式化数据。

        使用pandas.DataFrame.plot 进行绘图。如果matplotlib: List of named colors 中存在'color' 列中的颜色,则可以将它们传递给color 参数。

        # sample data
        df = pd.DataFrame([['red', 0, 0], ['red', 1, 1], ['red', 2, 2], ['red', 3, 3], ['red', 4, 4], ['red', 5, 5], ['red', 6, 6], ['red', 7, 7], ['red', 8, 8], ['red', 9, 9], ['blue', 0, 0], ['blue', 1, 1], ['blue', 2, 4], ['blue', 3, 9], ['blue', 4, 16], ['blue', 5, 25], ['blue', 6, 36], ['blue', 7, 49], ['blue', 8, 64], ['blue', 9, 81]], columns=['color', 'x', 'y'])
        
        # pivot the data into the correct shape
        df = df.pivot(index='x', columns='color', values='y')
        
        # display(df)
        color  blue  red
        x               
        0         0    0
        1         1    1
        2         4    2
        3         9    3
        4        16    4
        5        25    5
        6        36    6
        7        49    7
        8        64    8
        9        81    9
        
        # plot the pivoted dataframe; if the column names aren't colors, remove color=df.columns
        df.plot(color=df.columns, figsize=(5, 3))
        

        【讨论】:

        • 这更优雅
        【解决方案4】:

        如果您安装了seaborn,这是一种更简单的方法,不需要您执行pivot

        import seaborn as sns
        
        sns.lineplot(data=df, x='x', y='y', hue='color')
        

        【讨论】:

          【解决方案5】:

          您可以使用groupby根据颜色将DataFrame分成子组:

          for key, grp in df.groupby(['color']):
          

          import numpy as np
          import pandas as pd
          import matplotlib.pyplot as plt
          
          df = pd.read_table('data', sep='\s+')
          fig, ax = plt.subplots()
          
          for key, grp in df.groupby(['color']):
              ax = grp.plot(ax=ax, kind='line', x='x', y='y', c=key, label=key)
          
          plt.legend(loc='best')
          plt.show()
          

          产量

          【讨论】:

          • 无法使解决方案工作,因为我的数据集不是颜色,而参数“c”恰好是绘图线颜色。在 OP 的情况下,这很好,但对其他人来说会失败。如果您删除该参数,这个出色的解决方案也将适用于所有其他数据集。
          【解决方案6】:

          您可以使用此代码来获得您想要的输出

          import pandas as pd
          import matplotlib.pyplot as plt
          df = pd.DataFrame({'color': ['red','red','red','blue','blue','blue'], 'x': [0,1,2,3,4,5],'y': [0,1,2,9,16,25]})
          print df
          
            color  x   y
          0   red  0   0
          1   red  1   1
          2   red  2   2
          3  blue  3   9
          4  blue  4  16
          5  blue  5  25
          

          绘制图形

          a = df.iloc[[i for i in xrange(0,len(df)) if df['x'][i]==df['y'][i]]].plot(x='x',y='y',color = 'red')
          df.iloc[[i for i in xrange(0,len(df)) if df['y'][i]== df['x'][i]**2]].plot(x='x',y='y',color = 'blue',ax=a)
          
          plt.show()
          

          输出

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-06-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-19
            • 2017-06-09
            • 2016-01-11
            相关资源
            最近更新 更多