Pandas groupby在同一个情节上得出结果

时间:2017-03-23 22:40:41

标签: python pandas matplotlib

我正在处理以下数据框(仅用于说明,实际df非常大):

column

尝试为上述坐标绘制多个折线图(x为“x1对y为”y1“)。

具有相同“seq”的行是一条路径,并且必须绘制为一条单独的线,就像对应于seq = 2的所有x,y坐标属于一条线,依此类推。

我可以绘制它们,但是在单独的图表上,我想要同一个图表上的所有行,使用子图,但不能正确。

   seq          x1         y1
0  2           0.7725      0.2105
1  2           0.8098      0.3456
2  2           0.7457      0.5436
3  2           0.4168      0.7610
4  2           0.3181      0.8790
5  3           0.2092      0.5498
6  3           0.0591      0.6357
7  5           0.9937      0.5364
8  5           0.3756      0.7635
9  5           0.1661      0.8364

这会创建100个图形(等于唯一seq的数量)。建议我在同一个图表上获取所有行。

** UPDATE *

为了解决上述问题,我实现了以下代码:

import matplotlib as mpl
import matplotlib.pyplot as plt

%matplotlib notebook

df.groupby("seq").plot(kind = "line", x = "x1", y = "y1")

现在,我想要一种方法来绘制具有特定颜色的线条。我是集群1中seq = 2和5的聚类路径;和另一个集群中seq = 3的路径。

因此,群集1下面有两行,我想要红色,群集2下面有一行,可以是绿色。

我该如何处理?

5 个答案:

答案 0 :(得分:4)

你需要在绘图之前初始化轴,如本例所示

import pandas as pd
import matplotlib.pylab as plt
import numpy as np

# random df
df = pd.DataFrame(np.random.randint(0,10,size=(25, 3)), columns=['ProjID','Xcoord','Ycoord'])

# plot groupby results on the same canvas 
fig, ax = plt.subplots(figsize=(8,6))
df.groupby('ProjID').plot(kind='line', x = "Xcoord", y = "Ycoord", ax=ax)
plt.show()

enter image description here

答案 1 :(得分:4)

考虑数据框df

df = pd.DataFrame(dict(
        ProjID=np.repeat(range(10), 10),
        Xcoord=np.random.rand(100),
        Ycoord=np.random.rand(100),
    ))

然后我们创建像这样的抽象艺术

df.set_index('Xcoord').groupby('ProjID').Ycoord.plot()

enter image description here

答案 2 :(得分:4)

另一种方式:

for k,g in df.groupby('ProjID'):
  plt.plot(g['Xcoord'],g['Ycoord'])

plt.show()

答案 3 :(得分:0)

这是一个可行的示例,其中包括调整图例名称的功能。

grp = df.groupby('groupCol')

legendNames = grp.apply(lambda x: x.name)  #Get group names using the name attribute.
#legendNames = list(grp.groups.keys())  #Alternative way to get group names. Someone else might be able to speak on speed. This might iterate through the grouper and find keys which could be slower? Not sure

plots = grp.plot('x1','y1',legend=True, ax=ax)

for txt, name in zip(ax.legend_.texts, legendNames):
    txt.set_text(name)

说明: 图例值存储在参数ax.legend_中,该参数又包含一个Text()对象列表,每组一个项目,其中在matplotlib.text api中找到Text类。要设置文本对象的值,可以使用setter方法set_text(self,s)。

作为旁注,Text类具有许多set_X()方法,这些方法可让您更改字体大小,字体,颜色等。我没有使用过,所以我不确定它们工作,但看不出来为什么。

答案 4 :(得分:0)

根据Serenity的回答,我使传说变得更好。

import pandas as pd
import matplotlib.pylab as plt
import numpy as np

# random df
df = pd.DataFrame(np.random.randint(0,10,size=(25, 3)), columns=['ProjID','Xcoord','Ycoord'])

# plot groupby results on the same canvas 
grouped = df.groupby('ProjID')
fig, ax = plt.subplots(figsize=(8,6))
grouped.plot(kind='line', x = "Xcoord", y = "Ycoord", ax=ax)
ax.legend(labels=grouped.groups.keys()) ## better legend
plt.show()

,您也可以这样做:

grouped = df.groupby('ProjID')
fig, ax = plt.subplots(figsize=(8,6))
g_plot = lambda x:x.plot(x = "Xcoord", y = "Ycoord", ax=ax, label=x.name)
grouped.apply(g_plot)
plt.show()

,它看起来像: enter image description here