График Seaborn Line для построения нескольких параметров

У меня есть набор данных, как показано ниже,

index 10_YR_CAGR 5_YR_CAGR 1_YR_CAGR
c1_rev 20.5 21.5 31.5
c2_rev 20.5 22.5 24
c3_rev 21 24 27
c4_rev 20 26 30
c5_rev 24 19 15
c1_eps 21 22 23
c2_eps 21 24 25

Эти данные имеют 5 компаний и их параметры, такие как обороты, eps, прибыль и т. Д. Мне нужно построить график, как показано ниже:

rev:

  • x_axis- ›index_col c1_rev, ... c5_rev
  • y_axis - ›10_YR_CAGR .. 1_YR_CAGR

eps:

  • x_axis - ›index_col: c1_eps, ... c5_eps
  • y_axis - ›10_YR_CAGR, ... 1_YR_CAGR

так далее...

Я пробовал использовать следующий код:

eps = analysis_df[analysis_df.index.str.contains('eps',regex=True)]

for i1 in eps.columns[eps.columns!='index']:
    sns.lineplot(x="index",y=i1,data=eps,label=i1)

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

Вместо того, чтобы создавать цикл для отдельных параметров, как я могу выполнить цикл из основного исходного фрейма данных, чтобы создать диаграмму графиков с такими параметрами, как rev, eps, прибыль в параметры facegrid? Как применить этот фильтр в фасетной сетке?

Мой пример вывода приведенного выше кода,

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

Как построить один и тот же график для разных параметров в одном цикле for?


person Krish1992    schedule 19.03.2021    source источник


Ответы (1)


Обычно фасеты строятся путем объединения вашего analysis_df в столбцы id / variable / value.

  1. split() index столбец на Company и Parameter, которые мы позже будем использовать в качестве столбцов идентификаторов при плавлении:

    analysis_df[['Company', 'Parameter']] = analysis_df['index'].str.split('_', expand=True)
    
    #      index  10_YR_CAGR  5_YR_CAGR  1_YR_CAGR  Company  Parameter
    #  0  c1_rev         100         21          1       c1        rev
    #  1  c2_rev           1         32         24       c2        rev
    # ...
    
  2. melt() столбцы CAGR:

    melted = analysis_df.melt(
        id_vars=['Company', 'Parameter'],
        value_vars=['10_YR_CAGR', '5_YR_CAGR', '1_YR_CAGR'],
        var_name='Period',
        value_name='CAGR',
    )
    
    #      Company  Parameter      Period  CAGR
    #  0        c1        rev  10_YR_CAGR   100
    #  1        c2        rev  10_YR_CAGR     1
    #  2        c3        rev  10_YR_CAGR    14
    #  3        c1        eps  10_YR_CAGR     1
    # ...
    # 25        c2        pft   1_YR_CAGR    14
    # 26        c3        pft   1_YR_CAGR    17
    
  3. relplot() CAGR vs Company (цвет Period) для каждого Parameter с использованием melted фрейма данных:

    sns.relplot(
        data=melted,
        kind='line',
        col='Parameter',
        x='Company',
        y='CAGR',
        hue='Period',
        col_wrap=1,
        facet_kws={'sharex': False, 'sharey': False},
    )
    

график 3x1

Примеры данных для воспроизведения этого графика:

import io
import pandas as pd
csv = '''
index,10_YR_CAGR,5_YR_CAGR,1_YR_CAGR
c1_rev,100,21,1
c2_rev,1,32,24
c3_rev,14,23,7
c1_eps,1,20,50
c2_eps,21,20,25
c3_eps,31,20,37
c1_pft,20,1,10
c2_pft,25,20,14
c3_pft,11,55,17
'''
analysis_df = pd.read_csv(io.StringIO(csv))
person tdy    schedule 19.03.2021
comment
спасибо за обновление, как построить график построчно и использовать ylim на основе сюжета вместо обычного ylim, чтобы эта диаграмма выглядела хорошо? - person Krish1992; 19.03.2021
comment
Вы можете использовать col_wrap=1, чтобы установить 1 столбец (так что здесь 3 строки) и facet_kws={'sharey': False}, чтобы отсоединить оси y. Я отредактировал свой ответ этими вариантами. - person tdy; 19.03.2021
comment
Спасибо @tdy, это сработало. Но при этом отсутствуют метки x, только последняя диаграмма показывает xlabels. Есть идеи, как обновить xlabels для всех графиков? - person Krish1992; 19.03.2021
comment
Пожалуйста. Для меток x вы также можете отсоединить оси x: facet_kws={'sharex': False, 'sharey': False} (ответ обновлен) - person tdy; 19.03.2021