用于绘制多个参数的 Seaborn 线图

Seaborn Line Plot for plotting multiple parameters

我有如下数据集,

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 家公司及其参数,如 rev、eps、profit 等。我需要绘制如下:

修订:

每股收益:

等...

我试过以下代码:

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、profit 到 facegrid 参数的图表?如何在 facetgrid 中应用这些过滤器?

我上面代码的示例输出,

如何在单个 for 循环中为不同的参数绘制相同类型的图?

刻面的绘制方式通常是将 analysis_df“融合”到 id/variable/value 列中。

  1. split()index 列转换为 CompanyParameter,稍后我们将在熔化时将其用作 id 列:

    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},
    )
    

重现此图的样本数据:

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))