Как отобразить несколько фигур в виде вложенных графиков и кратных столбцов фрейма данных в seaborn?

#python #pandas #dataframe #seaborn

#python #панды #фрейм данных #seaborn

Вопрос:

Я пытался отобразить все столбцы моего фрейма данных на подзаголовках, но это не работает. есть ли разумный способ сделать это?

 import padas as pd
import seaborn as sns
    df = pd.DataFrame({'TR':np.arange(1, 6).repeat(5), 'A': np.random.randint(1, 100,25), 'B':  np.random.randint(50, 100,25), 'C':  np.random.randint(50, 1000,25), 'D':  np.random.randint(5, 100,25), 'E':  np.random.randint(5, 100,25),
                   'F':  np.random.randint(5, 100,25), 'G':  np.random.randint(5, 100,25), 'H':  np.random.randint(5, 100,25), 'I':  np.random.randint(5, 100,25), 'J':  np.random.randint(5, 100,25) })
row = 2
col = 5
r = sorted(list(range(0, row))*5)
c = list(range(0, col))*2

fig, axes = plt.subplots(row, col, figsize=(20, 10))

for j, k,i in zip( r, c, df.columns):
    plt.figure()
    g = sns.boxenplot(x = 'TR', y = df[i], ax= axes[j, k], data=df)

    plt.show()
 

Ответ №1:

Одна вещь заключается в том, что вам нужно plt.show выйти из цикла и прекратить создавать новый экземпляр figure с plt.figure помощью .

Также,

  1. проще сгладить axes и сжать
  2. похоже, вы хотите построить график из столбцов 1, а не столбца 0

Все вместе:

 row = 2
col = 5

fig, axes = plt.subplots(row, col, figsize=(20, 10))

# flattern `axes` with `.ravel()`    
# notice the `[1:]`
for ax,i in zip( axes.ravel(), df.columns[1:]):
    # remove this as well
    #  plt.figure()

    # you just need to pass y = i
    g = sns.boxenplot(x = 'TR', y = i, ax= ax, data=df)

# move `plt.show()` out of for loop:
plt.show()
 

Вывод:

введите описание изображения здесь


Обновление вероятно, более простой способ — использовать FacetGrid :

 fg = sns.FacetGrid(data=df.melt('TR'), 
                   col='variable', col_wrap=5, sharey=False)
fg.map(sns.boxenplot,'TR','value',order=df['TR'].unique)
 

Вывод:

введите описание изображения здесь

Комментарии:

1. Большое вам спасибо!

2. @MARCOSSANTOS добро пожаловать. Другое решение см. В обновлении. Кроме того, если это работает для вас, рассмотрите возможность повышения / принятия ответа.