为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕莱坞森 2021-10-26 18:54:22
我想绘制一个数据框,其中 y 值存储为列中的 ndarrays,即: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")grid.map(plt.plot, np.arange(0,5), "value")TypeError: unhashable type: 'numpy.ndarray'我是否需要将 ndarrays 分成单独的行?有没有一种简单的方法可以做到这一点?
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

这是在数据帧中存储数据的一种非常不寻常的方式。两个选项(我推荐选项 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 数组。


pandas:当单元格内容是列表时,为列表中的每个元素创建一行显示了一种方法。


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"]

//img1.sycdn.imooc.com//6177de920001b0b401970366.jpg

然后FacetGrid以通常的方式使用。


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

grid.map(plt.plot, "original_index", "values")


查看完整回答
反对 回复 2021-10-26
  • 1 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号