【问题标题】:Plot different DataFrames in the same figure在同一个图中绘制不同的 DataFrame
【发布时间】:2012-12-02 02:12:06
【问题描述】:

我有一个温度文件,有多年的温度记录,格式如下:

2012-04-12,16:13:09,20.6
2012-04-12,17:13:09,20.9
2012-04-12,18:13:09,20.6
2007-05-12,19:13:09,5.4
2007-05-12,20:13:09,20.6
2007-05-12,20:13:09,20.6
2005-08-11,11:13:09,20.6
2005-08-11,11:13:09,17.5
2005-08-13,07:13:09,20.6
2006-04-13,01:13:09,20.6

每年都有不同的数字,记录的时间,所以熊猫的日期时间索引都是不同的。

我想将不同年份的数据绘制在同一张图中进行比较。 X 轴是一月到十二月,Y 轴是温度。我该怎么做呢?

【问题讨论】:

    标签: python matplotlib pandas


    【解决方案1】:

    试试:

    ax = df1.plot()
    df2.plot(ax=ax)
    

    【讨论】:

    • 如果在ipython notebook上,如何实现?是否有保留或显示功能仅在设置所有设置后才打印图表?
    • 设置 %matplotlib inline 进行导入的位置,以便您的可视化显示在 iPython 笔记本中。
    • 如果有超过 3 个数据帧,任何线索如何工作?
    • 这太棒了。我会回答如何处理超过 3 个 dfs
    • 您确定这适用于plot()任何类型,即每当任何类型的规范作为参数传递给plot 函数时?
    【解决方案2】:

    虽然 Chang 的回答解释了如何在同一个图形上多次绘制,但在这种情况下,使用 groupbyunstacking 可能会更好:

    (假设您在数据框中有这个,并且已经有日期时间索引)

    In [1]: df
    Out[1]:
                value  
    datetime                         
    2010-01-01      1  
    2010-02-01      1  
    2009-01-01      1  
    
    # create additional month and year columns for convenience
    df['Month'] = map(lambda x: x.month, df.index)
    df['Year'] = map(lambda x: x.year, df.index)    
    
    In [5]: df.groupby(['Month','Year']).mean().unstack()
    Out[5]:
           value      
    Year    2009  2010
    Month             
    1          1     1
    2        NaN     1
    

    现在很容易绘制(每年单独一行):

    df.groupby(['Month','Year']).mean().unstack().plot()
    

    【讨论】:

      【解决方案3】:

      如果您正在运行 Jupyter/Ipython 笔记本并遇到问题;

      ax = df1.plot()

      df2.plot(ax=ax)

      在同一个单元格内运行命令!!由于某种原因,当它们被分成连续的单元格时,它不会起作用。至少对我来说。

      【讨论】:

        【解决方案4】:

        要对多个数据帧执行此操作,您可以对它们执行 for 循环:

        fig = plt.figure(num=None, figsize=(10, 8))
        ax = dict_of_dfs['FOO'].column.plot()
        for BAR in dict_of_dfs.keys():
            if BAR == 'FOO':
                pass
            else:
                dict_of_dfs[BAR].column.plot(ax=ax)
        

        【讨论】:

          【解决方案5】:

          只是为了增强@adivis12 的答案,您不需要执行if 语句。像这样写:

          fig, ax = plt.subplots()
          for BAR in dict_of_dfs.keys():
              dict_of_dfs[BAR].plot(ax=ax)
          

          【讨论】:

          • 谢谢,但你真的能做一个 dict_of_dfs 吗?是不是无法使用?
          • 但是 dict_of_dfs 只有字符串作为键。所以它们是可散列的。
          【解决方案6】:

          您可以使用seaborn 中的hue 参数。例如:

          import seaborn as sns
          df = sns.load_dataset('flights')
          
               year month  passengers
          0    1949   Jan         112
          1    1949   Feb         118
          2    1949   Mar         132
          3    1949   Apr         129
          4    1949   May         121
          ..    ...   ...         ...
          139  1960   Aug         606
          140  1960   Sep         508
          141  1960   Oct         461
          142  1960   Nov         390
          143  1960   Dec         432
          
          sns.lineplot(x='month', y='passengers', hue='year', data=df)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-06-12
            • 1970-01-01
            相关资源
            最近更新 更多