2017-03-23 63 views
4

我處理下面的數據幀的結果(僅是爲了說明,實際df是相當大的):熊貓GROUPBY在同一曲線圖

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 

試圖繪製用於上述座標多個線圖(x作爲「x1針對y作爲」y1「)

具有相同」seq「的行是一條路徑,並且必須被繪製爲一條單獨的行,就像對應於seq = 2的所有x,y座標屬於一條線,等等。

我能夠繪製他們,但在一個單獨的圖上,我想要所有的林es在同一個圖表上,使用子圖,但沒有得到正確的結果。

import matplotlib as mpl 
import matplotlib.pyplot as plt 

%matplotlib notebook 

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

這創建了100個圖(它等於唯一seq的數量)。建議我以一種方式獲取同一圖表上的所有行。

**更新*

要解決上述問題,我實現了下面的代碼:

 fig, ax = plt.subplots(figsize=(12,8)) 
    df.groupby('seq').plot(kind='line', x = "x1", y = "y1", ax = ax) 
    plt.title("abc") 
    plt.show() 

現在,我想要的方式繪製特定顏色的線條。我是羣集1中的seq = 2和5的聚類路徑;和另一個集羣中seq = 3的路徑。

所以,在簇1下有兩條線,我想用紅色表示,而在簇2下有一條線,可以是綠色的。

我應該如何繼續?

+0

你看到http://stackoverflow.com/questions/28203643/plotting-multiple-lines-in-ipython-pandas-produces-multiple-plots –

回答

3

你需要在這個例子中

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

+0

非常感謝,這正是我想要的。 – Liza

+0

看看這裏的答案:https://stackoverflow.com/questions/26139423/plot-different-color-for-different-categorical-levels-using-matplotlib – Serenity

+0

這是相當不錯的,但如果我想要圖例列表ProjID列值而不是「Ycoord」? – autonomy

3

情節之前初始化軸像考慮數據框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

+0

謝謝你,這是完美的。也是一個單行代碼。 – Liza

5

另一種方式:

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

plt.show()