如何将数据框中的不同数据组绘制到一个图表中

134
我有一个温度文件,其中包含多年的温度记录,格式如下:
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

每年的记录次数都不同,所以datetimeindices也都不同。
我想在同一张图中绘制不同年份的数据进行比较:
  • X轴是从一月到十二月的datetimeindices
  • Y轴是温度
我应该如何操作?
5个回答

406

尝试:

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

42

如果你正在运行Jupyter/Ipython笔记本,并且在使用以下代码时遇到问题;

ax = df1.plot()

df2.plot(ax=ax)

请在同一个单元格内运行这些命令!由于某种原因,当它们分开放在连续的单元格中时,它们不会工作。至少对我来说是这样。


37
  • Chang的回答展示了如何在同一axes上绘制不同的DataFrame。
  • 在这种情况下,所有数据都在同一个数据框中,因此最好使用groupbyunstack
  • 在使用pandas.read_csv时,names=会在文件中没有列标题时创建列标题。必须将'date'列解析为datetime64[ns] Dtype,以便可以使用.dt提取器来提取monthyear
import pandas as pd

# given the data in a file as shown in the op
df = pd.read_csv('temp.csv', names=['date', 'time', 'value'], parse_dates=['date'])
    
# create additional month and year columns for convenience
df['Year'] = df.date.dt.year
df['Month'] = df.date.dt.month

# groupby the month a year and aggreate mean on the value column
dfg = df.groupby(['Month', 'Year'])['value'].mean().unstack()

# display(dfg)                     
Year        2005  2006       2007  2012
Month                                  
4            NaN  20.6        NaN  20.7
5            NaN   NaN  15.533333   NaN
8      19.566667   NaN        NaN   NaN

现在可以轻松地将每年作为单独的线条绘制出来。原作者每年只有一个观察值,因此只显示一个标记。

ax = dfg.plot(figsize=(9, 7), marker='.', xticks=dfg.index)

在此输入图片描述


6
为了对多个数据帧执行此操作,您可以通过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)

这也可以不使用if条件实现:
fig, ax = plt.subplots()
for BAR in dict_of_dfs.keys():
    dict_of_dfs[BAR].plot(ax=ax)

2
您可以利用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)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接