使用Seaborn与FacetGrid进行绘图,其中值是数据帧中的ndarray

时间:2019-02-01 15:08:57

标签: python pandas numpy seaborn

我想绘制一个数据框,其中y值作为ndarray存储在列中 即:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame(index=np.arange(0,4), columns=('sample','class','values'))
for iloc in [0,2]:
    df.loc[iloc] = {'sample':iloc, 
                    'class':'raw', 
                    'values':np.random.random(5)}
    df.loc[iloc+1] = {'sample':iloc,
                      'class':'predict',
                      'values':np.random.random(5)}

grid = sns.FacetGrid(df, col="class", row="sample")
grid.map(plt.plot, np.arange(0,5), "value")

TypeError: unhashable type: 'numpy.ndarray'

我需要将ndarray分成单独的行吗?有没有简单的方法可以做到这一点?

谢谢

1 个答案:

答案 0 :(得分:1)

这是在数据框中存储数据的一种非常不寻常的方式。两个选项(我建议使用选项B):

A。 Seaborn中的自定义映射

事实上seaborn本身不支持这种格式。您可以构造自己的函数以绘制到网格上。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame(index=np.arange(0,4), columns=('sample','class','values'))
for iloc in [0,2]:
    df.loc[iloc] = {'sample':iloc, 
                    'class':'raw', 
                    'values':np.random.random(5)}
    df.loc[iloc+1] = {'sample':iloc,
                      'class':'predict',
                      'values':np.random.random(5)}

grid = sns.FacetGrid(df, col="class", row="sample")

def plot(*args,**kwargs):
    plt.plot(args[0].iloc[0], **kwargs)

grid.map(plot, "values")

B。取消嵌套

但是我建议先“取消嵌套”数据框,并删除单元格内的numpy数组。

enter image description here显示了一种方法。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame(index=np.arange(0,4), columns=('sample','class','values'))
for iloc in [0,2]:
    df.loc[iloc] = {'sample':iloc, 
                    'class':'raw', 
                    'values':np.random.random(5)}
    df.loc[iloc+1] = {'sample':iloc,
                      'class':'predict',
                      'values':np.random.random(5)}

res = df.set_index(["sample", "class"])["values"].apply(pd.Series).stack().reset_index()
res.columns = ["sample", "class", "original_index", "values"]

pandas: When cell contents are lists, create a row for each element in the list

然后以通常的方式使用FacetGrid

grid = sns.FacetGrid(res, col="class", row="sample")
grid.map(plt.plot, "original_index", "values")