Seaborn Line Plot 用于绘制多个参数

Posted

技术标签:

【中文标题】Seaborn Line Plot 用于绘制多个参数【英文标题】:Seaborn Line Plot for plotting multiple parameters 【发布时间】:2021-06-16 14:51:18 【问题描述】:

我有如下数据集,

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、利润等。我需要绘制如下图:

版本:

x_axis-> index_col c1_rev, ...c5_rev y_axis -> 10_YR_CAGR .. 1_YR_CAGR

每股收益:

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

我上面代码的示例输出,

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

【问题讨论】:

【参考方案1】:

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

    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
    # ...
    

    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
    

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

【讨论】:

感谢更新,如何逐行绘制图表并使用基于plot的ylim代替普通的ylim,这样图表才好看? 您可以使用 col_wrap=1 设置 1 列(此处为 3 行)和 facet_kws='sharey': False 取消链接 y 轴。我用这些选项编辑了我的答案。 感谢@tdy,它成功了。但是执行此操作时缺少 x 标签,只有最后一个图表显示 xlabels。关于如何将 xlabels 更新到所有地块的任何想法? 不客气。对于 x 标签,您也可以取消链接 x 轴:facet_kws='sharex': False, 'sharey': False(答案已更新)

以上是关于Seaborn Line Plot 用于绘制多个参数的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn使用regplot函数可视化散点图并添加回归曲线以及回归线对应的置信区间(Scatter plot with regression line)

Seaborn使用regplot函数可视化散点图并添加回归曲线以及回归线对应的置信区间(Scatter plot with regression line)

Seaborn使用lmplot函数可视化散点图并添加回归曲线以及回归线对应的置信区间(Scatter plot with regression line)

seaborn使用jointplot函数为散点图添加边缘图添加回归线为边缘直方图添加密度曲线(Add Regression Line to Marginal Plot)

Python使用matplotlib可视化散点图使用seaborn中的lmplot函数可视化不同分组散点图的最优线性回归拟合曲线(Scatter plot with regression line)

seaborn 绘图