2017-09-22 103 views
0

我想創建基於不同分類列的點着色數據集的散點圖。 Seaborn行之有效這裏一個情節:Python繪製不同的數據幀列(使用Seaborn?)

fg = sns.FacetGrid(data=plot_data, hue='col_1') 
fg.map(plt.scatter, 'x_data', 'y_data', **kws).add_legend() 
plt.show() 

我再要顯示的數據相同,但色調=「COL_2」和色調=「col_3」。如果我只拍3張圖,效果很好,但我真的希望找到一種方法讓它們在一個圖中顯示爲子圖。不幸的是,我還沒有找到任何方法來改變從一個情節到另一個情節的色調。我知道有繪圖API允許使用axis關鍵字,因此可以將它彈出到matplotlib圖中,但是我沒有找到同時允許您設置'ax ='和'hue ='的API。有任何想法嗎? 在此先感謝!

編輯: 下面是一些示例代碼來說明這個想法

xx = np.random.rand(10,2) 
cat1 = np.array(['cat','dog','dog','dog','cat','hamster','cat','cat','hamster','dog']) 
cat2 = np.array(['blond','brown','brown','black','black','blond','blond','blond','brown','blond']) 
d = {'x':xx[:,0], 'y':xx[:,1], 'pet':cat1, 'hair':cat2} 
df = pd.DataFrame(data=d) 

sns.set(style='ticks') 
fg = sns.FacetGrid(data=df, hue='pet', size=5) 
fg.map(plt.scatter, 'x', 'y').add_legend() 
fg = sns.FacetGrid(data=df, hue='hair', size=5) 
fg.map(plt.scatter, 'x', 'y').add_legend() 
plt.show() 

這繪製我想要的東西,但在兩個窗口。顏色方案通過「寵物」分組在第一個圖中設置,在第二個圖中通過「頭髮」設置。有沒有辦法在一個情節上做到這一點?

回答

0

爲了繪製3個不同顏色的散點圖,您可以在matplotlib中創建3個座標軸,並繪製每個座標軸的散點圖。

import pandas as pd 
import numpy as np; np.random.seed(42) 
import matplotlib.pyplot as plt 

df = pd.DataFrame(np.random.rand(10,5), 
        columns=["x", "y", "col1", "col2", "col3"]) 

fig, axes = plt.subplots(nrows=3) 
for ax, col in zip(axes, df.columns[2:]): 
    ax.scatter(df.x, df.y, c=df[col]) 

plt.show() 

enter image description here

對分類數據也往往容易積數散點圖,每個類別之一。

import pandas as pd 
import numpy as np; np.random.seed(42) 
import matplotlib.pyplot as plt 
import seaborn as sns 


xx = np.random.rand(10,2) 
cat1 = np.array(['cat','dog','dog','dog','cat','hamster','cat','cat','hamster','dog']) 
cat2 = np.array(['blond','brown','brown','black','black','blond','blond','blond','brown','blond']) 
d = {'x':xx[:,0], 'y':xx[:,1], 'pet':cat1, 'hair':cat2} 
df = pd.DataFrame(data=d) 


cols = ['pet',"hair"] 
fig, axes = plt.subplots(nrows=len(cols)) 
for ax,col in zip(axes,cols): 
    for n, group in df.groupby(col): 
     ax.scatter(group.x,group.y, label=n) 
    ax.legend() 

plt.show() 

enter image description here

你可以肯定使用FacetGrid,如果你真的想,但需要數據幀的不同數據格式。

import pandas as pd 
import numpy as np; np.random.seed(42) 
import matplotlib.pyplot as plt 
import seaborn as sns 

xx = np.random.rand(10,2) 
cat1 = np.array(['cat','dog','dog','dog','cat','hamster','cat','cat','hamster','dog']) 
cat2 = np.array(['blond','brown','brown','black','black','blond','blond','blond','brown','blond']) 
d = {'x':xx[:,0], 'y':xx[:,1], 'pet':cat1, 'hair':cat2} 
df = pd.DataFrame(data=d) 

df2 = pd.melt(df, id_vars=['x','y'], value_name='category', var_name="kind") 

fg = sns.FacetGrid(data=df2, row="kind",hue='category', size=3) 
fg.map(plt.scatter, 'x', 'y').add_legend() 

enter image description here

+0

如果此解決方案是不是你是什麼之後,你應該提供問題的樣本數據集,並解釋清楚了每個情節應該顯示。 – ImportanceOfBeingErnest

+0

上面的圖是我之後的,除了指定顏色的列是分類變量。所以,例如,「col1」可能是 'favorite_movies = ['batman','lego movie','alien',...]' 這就是使用Seaborn看起來像一個不錯的選擇的地方,我遇到了一些問題,試圖改變用於設置從情節到情節的色調的數據。 – user7828298

+0

我建議您向我們展示產生您想要的數據框的代碼(例如,不清楚所有列的值是否相同)。然後,我們可以找到解決方案 – ImportanceOfBeingErnest