在一个图形中绘制多个pandas数据帧

时间:2017-08-02 17:23:42

标签: python pandas matplotlib dataframe

我创建了6个不同的数据帧,消除了原始数据帧的异常值。现在,我正在尝试绘制消除同一图表上异常值的所有数据帧。

这是我的代码,它消除了每个数据框中的异常值:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use("ggplot")

#---Original DataFrame
x = (g[0].time[:27236])
y = (g[0].data.f[:27236])
df = pd.DataFrame({'Time': x, 'Data': y})

#----Removes the outliers in a given DataFrame and plots a graph
newdf = df.copy()
newdf = df[~df.groupby('Data').transform( lambda x: abs(x-x.mean()) > 1.96*x.std()).values]
#newdf.plot('Time', 'Data')

#---Original DataFrame
x = (q[0].time[:47374])
y = (q[0].data.f[:47374])
df = pd.DataFrame({'Time': x, 'Data': y})

#----Removes the outliers in a given DataFrame and plots a graph
newdf = df.copy()
newdf2 = df[~df.groupby('Data').transform( lambda x: abs(x-x.mean()) > 1.96*x.std()).values]
#newdf2.plot('Time', 'Data')

#---Original DataFrame
x = (w[0].time[:25504])
y = (w[0].data.f[:25504])
df = pd.DataFrame({'Time': x, 'Data': y})

#----Removes the outliers in a given DataFrame and plots a graph
newdf = df.copy()
newdf3 = df[~df.groupby('Data').transform( lambda x: abs(x-x.mean()) > 1.96*x.std()).values]
#newdf3.plot('Time', 'Data')

#---Original DataFrame
x = (e[0].time[:47172])
y = (e[0].data.f[:47172])
df = pd.DataFrame({'Time': x, 'Data': y})

#----Removes the outliers in a given DataFrame and plots a graph
newdf = df.copy()
newdf4 = df[~df.groupby('Data').transform( lambda x: abs(x-x.mean()) > 1.96*x.std()).values]
#newdf4.plot('Time', 'Data')

#---Original DataFrame
x = (r[0].time[:21317])
y = (r[0].data.f[:21317])
df = pd.DataFrame({'Time': x, 'Data': y})

#----Removes the outliers in a given DataFrame and plots a graph
newdf = df.copy()
newdf5 = df[~df.groupby('Data').transform( lambda x: abs(x-x.mean()) > 1.96*x.std()).values]
#newdf5.plot('Time', 'Data')

#---Original DataFrame
x = (t[0].time[:47211])
y = (t[0].data.f[:47211])
df = pd.DataFrame({'Time': x, 'Data': y})

#----Removes the outliers in a given DataFrame and plots a graph
newdf = df.copy()
newdf6 = df[~df.groupby('Data').transform( lambda x: abs(x-x.mean()) > 1.96*x.std()).values]
#newdf6.plot('Time', 'Data')

如果我删除评论newdf.plot(),我将能够单独绘制所有图表,但我希望它们全部放在一张图表上。

是的,我已经阅读了http://matplotlib.org/examples/pylab_examples/subplots_demo.html 但该链接没有任何一个图表中有多个图的示例。

我也读过这个:http://pandas-docs.github.io/pandas-docs-travis/visualization.html它有一些非常好的信息,但是在一个图中有多个图的例子使用相同的数据帧。我有6个独立的数据帧。 我想到我的问题的一个解决方案是将所有数据帧写入相同的excel文件,然后从excel中绘制它们,但这似乎过多,我不需要将这些数据保存到excel文件中。

我的问题是: 如何在同一图表中绘制多个pandas数据帧。

按照斯科特的建议,我的图表 enter image description here

enter image description here

图表应该或多或少看起来像什么

3 个答案:

答案 0 :(得分:5)

您需要使用pandas.dataframe.plot中的ax参数。

在第一个df.plot上使用以获取该轴上的句柄:

ax = newdf.plot() 

然后在随后的图中使用ax参数。

newdf2.plot(ax=ax)
...
newdf5.plot(ax=ax)

答案 1 :(得分:1)

我错过了什么吗? 通常,我只针对多个数据帧执行此操作:

production.component.ts

答案 2 :(得分:0)

答案 26 是非常好的解决方案。我已经尝试过我的数据框,如果 x 列是日期,那么几乎不需要改变,例如,

              Date    Key  Confirmed   Deaths
14184   2020-02-12  US_TX        1.0      0.0
14596   2020-02-13  US_TX        2.0      0.0
15007   2020-02-14  US_TX        2.0      0.0
15418   2020-02-15  US_TX        2.0      0.0
15823   2020-02-16  US_TX        2.0      0.0
...            ...    ...        ...      ...
270228  2020-11-07  US_TX   950549.0  19002.0
271218  2020-11-08  US_TX   956234.0  19003.0
272208  2020-11-09  US_TX   963019.0  19004.0
273150  2020-11-10  US_TX   973970.0  19004.0
274029  2020-11-11  US_TX   985380.0  19544.0
              Date    Key  Confirmed   Deaths
21969   2020-03-01  US_NY        1.0      0.0
22482   2020-03-02  US_NY        1.0      0.0
23014   2020-03-03  US_NY        2.0      0.0
23555   2020-03-04  US_NY       11.0      0.0
24099   2020-03-05  US_NY       22.0      0.0
...            ...    ...        ...      ...
270218  2020-11-07  US_NY   530354.0  33287.0
271208  2020-11-08  US_NY   533784.0  33314.0
272198  2020-11-09  US_NY   536933.0  33343.0
273140  2020-11-10  US_NY   540897.0  33373.0
274019  2020-11-11  US_NY   545718.0  33398.0
import pandas as pd
from matplotlib import pyplot as plt

firstPlot = firstDataframe.plot(x='Date') # where the 'Date' is the column with date.

secondDataframe.plot(x='Date', ax=firstPlot)

...
plt.show()