2017-09-22 58 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