2015-10-29 74 views
6

我有一組數據存儲在一個熊貓數據框中。我正在嘗試使用seaborn的pointplot()來創建連接點的多系列散點圖。每個系列具有不同的(x,y)值,並且它們以浮點形式存儲在我的數據框中。每行都有一個標籤,區分每個系列。我使用Python 2.7,seaborn版本0.5.1和matplotlib版本1.4.3。我設法找到如何使用seaborn創建連接點的多個連續散點圖?

一切都告訴我,我可以用下面的實現:

import matplotlib.pyplot as plt 
import seaborn as sns 

# Suppose my dataframe is called 'df', with columns 'x', 'y', and 'label'. 
sns.pointplot(x = 'x', y = 'y', hue = 'label', data = df) 

然而,這會導致一些奇怪的行爲:

  • 的顏色被正確識別,但只有點的一些連接
  • x軸上的數字重疊,它看起來好像每個數據點都被標記爲它的值而非臨時值n用合適的乾淨值對其進行縮放(似乎將x數據視爲字符串/標籤而不是浮動)。

我試圖通過將我的數據框分成小塊來解決這個問題。這不是理想的,因爲我可以有大約10+系列同時繪製,而我寧願不手動分割數據:

df1 = df[df.test_type.values == "label 1"] 
df2 = df[df.test_type.values == "label 2"] 

ax = sns.pointplot(x = 'x',y='y', color = "blue", data = df1) 
sns.pointplot(x = 'x', y = 'y', data = df2, color="red", ax = ax) 

在這種情況下,所有點都連結以及它們適當的顏色,但再次,x軸顯示出非常奇怪的行爲。儘管每個數據框中的x值都不相同,但情節會將它們對齊,以使它們看起來相同。

現在,我不知道如何幹淨後我的輸出/地塊,但我的一些問題,可以用下面的重新創建:在下面的

#import the necessary modules 
import matplotlib.pyplot as plt 
import pandas as pd 
import seaborn as sns 

#Here is some sample data. The 'x2' data is slightly offset from 'x1' 
x1 = range(0,100,10) 
x2 = range(1,100,10) 
x = x1+x2 

#The y-values I generate here mimic the general shape of my actual data 
y1 = x1[::-1] 
y2 = [i+25 for i in x1[::-1]] 
y = y1+y2 

#Two levels of labels that will be applied to the data 
z1 = ["1"]*10 
z2 = ["2"]*10 
z = z1+z2 

#A pandas data frame from the above data 
df = pd.DataFrame({'x': x, 'y': y, 'z': z}) 

#Pointplot using the above data 
sns.pointplot(x = 'x', y = 'y', data = df, hue = 'z') 

運行這段代碼的結果:

  • 所有系列的所有x值均勻間隔。請注意,'x2'值與'1'翻譯的'x1'相同,並且每個系列中的間隔爲10。我沒有想到這種行爲。
  • x軸沒有「乾淨」的看起來的比例。它從字面上標註每個點的相應x值。它正確標記了這些點,但沒有適當地進行縮放。它看起來像是將x值視爲標籤,類似於條形圖的行爲方式。
  • 點已着色正確,但沒有連接點。

總結我的問題:

有沒有更簡單/更好/更優雅繪製多系列散點圖使用存儲在大熊貓數據幀的數據連接方式分? Seaborn的觀點看起來很理想,但它並不像我預期的那樣運作,我懷疑它可能有助於達到與我需要完成的目標不同的目的。我願意接受其他可以實現這個目標的解決方案(最好使用python)。

在此先感謝。我會更新我的問題,如果我能弄清楚如何從我的代碼上傳輸出和圖。

我是100%新來的stackoverflow。我很想通過發佈由我的代碼生成的圖來澄清我的問題,但我無法弄清楚。任何關於如何做到這一點的指針都會非常感謝,所以我可以更新這個問題。

編輯:原來,seaborn的pointplot使用x軸作爲一個明確的軸線,這也解釋了奇怪的行爲,我上面提到的。有沒有辦法手動將X軸行爲從分類變爲數字?這似乎是最簡單的方法,但我不熟悉python中的微調圖。

+0

您的代碼很好,並且新用戶無法嵌入圖片。您可以將它們上傳到imgur.com併發佈網址,然後有人將其編輯到問題中。 –

+0

我想你只是想用'plt.plot' – mwaskom

+0

我認爲這是正確的方向,但我不清楚我如何着色/連接同一系列或組中的點。我現在想讀這個,但我似乎無法找到一個可以詳細解釋plt.plot功能的源代碼。 –

回答

4

隨着@mwaskom和this question的幫助下,我已經成功地找到一個解決我的貼的問題:

#Assuming df is a pandas data frame with columns 'x', 'y', and 'label' 
for key,grp in df.groupby('label'): 
    plt.plot(grp.x,grp.y,'o-',label = key) 
plt.legend(loc = 'best') 
3

我也有類似的問題,我最後用Seaborn的FacetGrid解決它。我用plt.scatter作爲點,plt.plot用於連接點。

g = sns.FacetGrid(df, hue="z", size=8) 
g.map(plt.scatter, "x", "y") 
g.map(plt.plot, "x", "y") 

Time series plots

注意,這是在Seaborn版本0.6.0在0.5.1做,不是。