使用带有 FacetGrid 的 seaborn 绘图,其中值是数据帧中的 ndarray

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


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'

我是否需要将 ndarrays 分成单独的行?有没有一种简单的方法可以做到这一点?


慕莱坞森
浏览 199回答 1
1回答

狐的传说

这是在数据帧中存储数据的一种非常不寻常的方式。两个选项(我推荐选项 B):A. seaborn 中的自定义映射事实上,seaborn 本身并不支持这种格式。不过,您可以构建自己的函数来绘制到网格。import numpy as npimport pandas as pdimport seaborn as snsimport matplotlib.pyplot as pltdf = 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 数组。pandas:当单元格内容是列表时,为列表中的每个元素创建一行显示了一种方法。import numpy as npimport pandas as pdimport seaborn as snsimport matplotlib.pyplot as pltdf = 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"]然后FacetGrid以通常的方式使用。grid = sns.FacetGrid(res, col="class", row="sample")grid.map(plt.plot, "original_index", "values")
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python