График с использованием seaborn с FacetGrid, где значения ndarray в dataframe - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу построить график данных, где значения 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 на отдельные строки?Есть ли простой способ сделать это?

Спасибо

1 Ответ

0 голосов
/ 01 февраля 2019

Это довольно необычный способ хранения данных в кадре данных.Два варианта (я бы порекомендовал вариант 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.Unnesting

Однако я бы посоветовал сначала «развернуть» фрейм данных и избавиться от пустых массивов внутри ячеек.

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

enter image description here

Затем используйте FacetGrid обычным способом.

grid = sns.FacetGrid(res, col="class", row="sample")
grid.map(plt.plot, "original_index", "values")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...