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"]
然后FacetGrid以通常的方式使用。
grid = sns.FacetGrid(res, col="class", row="sample")
grid.map(plt.plot, "original_index", "values")
添加回答
举报