график / подзадачи seaborn для отображения одной переменной в 1-м столбце и другой переменной во 2-м столбце для того же идентификатора строки - PullRequest
1 голос
/ 11 января 2020

Я пытаюсь построить участок сюжета для морской сетки таким образом, чтобы 1. В каждой строке рисунка / графика был график одного объекта клиента, который пытается построить. 2. Столбцы этой строки будут представлять линейные графики различных переменных этого же клиента.

Так, например, если есть клиент AB C, XYZ, PQR с тенденцией исторического дохода и тенденцией исторических расходов, Я хотел бы построить субплот

AB C Income, а затем субплот расходов рядом с ним

Subplot XYZ Income, а затем субплот расходов рядом с ним

PQRS Income subplot и затем расходный subplot рядом с ним.

Я могу построить подзаговоры для той же переменной, но не могу включить вторую переменную во второй столбец. Любые указатели были бы чрезвычайно полезны.

num_plots = len(clients)
fig,ax=plt.subplots(30,2,figsize=(12,96))
fig.subplots_adjust(hspace=0.4,wspace=0.4)
for x in range(num_plots):
    df = dfABC[dfABC['Client'] == clients[x]]
    row = x//2
    col = x%2
    ax_curr = ax[row,col]
    sns.lineplot(data=df,x='Year',y='Income',ax=ax_curr).set_title(clients[x])

Это создает график 30 на 2 столбца, каждый из которых представляет только доход. Как я могу получить график расходов в качестве второго столбца?

1 Ответ

2 голосов
/ 11 января 2020
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns

# Data generation
clients = ['ABC', 'XYZ', 'PQR']
n_points = 1000
dfABC = pd.DataFrame(
        {'Client': np.random.choice(clients, size=n_points),
         'Year': np.random.choice([2010, 2011, 2012, 2013], size=n_points),
         'Income': np.random.exponential(size=n_points)*10,
         'Expense': np.random.exponential(size=n_points)})

# Figure generation
clients = list(dfABC['Client'].unique())
n_rows = len(clients)
fig,ax=plt.subplots(n_rows,2,figsize=(12,96))
fig.subplots_adjust(hspace=0.4,wspace=0.4)
for i, client in enumerate(clients):
    df = dfABC[dfABC['Client'] == client]
    sns.lineplot(data=df,x='Year',y='Income',ax=ax[i, 0]).set_title(client)
    sns.lineplot(data=df,x='Year',y='Expense',ax=ax[i, 1]).set_title(client)

enter image description here

...