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
列转换为Company
和Parameter
,我们稍后将在熔化时将其用作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)