Связано с несколькими болотами внутри фигуры Pandas - PullRequest
0 голосов
/ 06 марта 2020

Этот вопрос относится к группированию нескольких сюжетов в одну цифру python, "отдельные 28 сюжетов". Это мой код:

for column in df.columns[1:]:
    sns.set()
    fig, ax = plt.subplots(nrows=3, ncols=3) # tried 9 plots in one figure
    sns.set(style="whitegrid")
    sns.swarmplot(x='GF', y=column, data=df,order=["WT", 'Eulomin'])  # Choose column
    sns.despine(offset=10, trim=True) #?
    plt.savefig('{}.png'.format(column), bbox_inches='tight')  #  filename 
plt.show()

У меня более 100 столбцов, каждый файл сохраняется отдельно и просто печатает пустые графики рядом с обычным. Как сохранить 9 графиков на одной фигуре, чтобы они достигли того момента, когда у него останется 5 (что также должно быть на одной фигуре)?

1 Ответ

1 голос
/ 06 марта 2020

Вместо того, чтобы перебирать столбцы, перебирайте кратные 9 с range, чтобы индексировать кадр данных по номеру столбца, помещая каждый swarmplot в массив ax, который вы определяете:

from itertools import product
...
sns.set(style="whitegrid")

for i in range(1, 100, 9):                         # ITERATE WITH STEPS
    col = i
    fig, ax = plt.subplots(nrows=3, ncols=3, figsize = (12,6)) 

    # TRAVERSE 3 X 3 MATRIX
    for r, c in product(range(3), range(3)):
        if col in range(len(df.columns)):         # CHECK IF COLUMN EXISTS
            # USE ax ARGUMENT WITH MATRIX INDEX
            sns.swarmplot(x='GF', y=df[df.columns[col]], data=df, ax=ax[r,c],
                          order=["WT", 'Eulomin'])
            sns.despine(offset=10, trim=True)
            col += 1

    plt.tight_layout()
    plt.savefig('SwarmPlots_{0}-{1}.png'.format(i,i+8), bbox_inches='tight')

Для демонстрации случайными, посеянными данными из 100 столбцов по 500 строк для воспроизводимости:

Данные

import numpy as np
import pandas as pd

np.random.seed(362020)
cols = ['Col'+str(i) for i in range(1,100)]
df = (pd.DataFrame([np.random.randn(99) for n in range(500)])
        .assign(GF = np.random.choice(['r', 'python', 'julia'], 500))
        .set_axis(cols + ['GF'], axis='columns', inplace = False)
        .reindex(['GF'] + cols, axis='columns')
     )          

df.shape
# (500, 100)

Сюжет

import matplotlib.pyplot as plt
import seaborn as sns
from itertools import product

sns.set(style="whitegrid")

for i in range(1, 100, 9):
    col = i
    fig, ax = plt.subplots(nrows=3, ncols=3, figsize = (12,6)) 

    for r, c in product(range(3), range(3)):
        if col in range(len(df.columns)):
            sns.swarmplot(x='GF', y=df[df.columns[col]], data=df, ax=ax[r,c])
            col += 1

    plt.tight_layout()
    plt.savefig('SwarmPlots_{0}-{1}.png'.format(i,i+8), bbox_inches='tight')

plt.show()
plt.clf()
plt.close()

Выход (первый участок)

Plot Output

...