seaborn implot 将数据集组合成一个图

seaborn implot combine datasets into one plot

这可能是一个愚蠢的问题,但我有多个图看起来冗余的代码都是基于 pandas 数据帧的一年时间序列数据。是否可以将这些组合成一个图,但每一年的数据(2018、2019、2020)都是不同的颜色?任何提示在这里都没有太多智慧。

g = sns.lmplot(x="CDD",y="kWh",data=df_2018_avg, fit_reg=True) 
g.fig.set_size_inches(15,8)

g.fig.suptitle(f'2018 kWh / Day Vs CDD model: R-squared {round(stats_model_2018.rsquared,2)}')

g = sns.lmplot(x="CDD",y="kWh",data=df_2019_avg, fit_reg=True) 
g.fig.set_size_inches(15,8)

g.fig.suptitle(f'2019 kWh / Day Vs CDD model: R-squared {round(stats_model_2019.rsquared,2)}')

g = sns.lmplot(x="CDD",y="kWh",data=df_2020_avg, fit_reg=True) 
g.fig.set_size_inches(15,8)

g.fig.suptitle(f'2020 kWh / Day Vs CDD model: R-squared {round(stats_model_2020.rsquared,2)}')

如果您接受使用 sns.regplot(轴级函数)而不是 sns.lmplot(图形级函数),则可以将所有图形合并为一个:

演示:

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')
fig, ax = plt.subplots(figsize=(15, 8))

for day, df in tips.groupby('day'):
    sns.regplot(x="total_bill", y="tip", data=df, ax=ax, label=day)

ax.legend()
plt.show()

@JohanC

增强

将 'year' 列附加到与数据年份匹配的每个数据框。

df_2018_avg['year'] = 2018
df_2019_avg['year'] = 2019
df_2020_avg['year'] = 2020

然后将每个table组合成一个数据帧

df = pd.concat([df_2018_avg, df_2019_avg, df_2020_avg])

然后只需在您的 seaborn 函数中添加 'hue' 参数。

g = sns.lmplot(x="CDD",y="kWh",data=df, fit_reg=True, hue='year')

您可以添加一个额外的列来包含年份并将数据框连接起来形成一个大数据框。然后你可以使用 hue='year':

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

df_2018_avg = pd.DataFrame({'CDD': np.linspace(0, 21, 100),
                            'kWh': np.linspace(9000, 10500, 100) + np.random.normal(0, 500, 100)})
df_2019_avg = pd.DataFrame({'CDD': np.linspace(0, 21, 100),
                            'kWh': np.linspace(9000, 11000, 100) + np.random.normal(0, 500, 100)})
df_2020_avg = pd.DataFrame({'CDD': np.linspace(0, 21, 100),
                            'kWh': np.linspace(8000, 10000, 100) + np.random.normal(0, 500, 100)})
df_2018_avg['year'] = 2018
df_2019_avg['year'] = 2019
df_2020_avg['year'] = 2020

g = sns.lmplot(x="CDD", y="kWh", hue="year",
               data=pd.concat([df_2018_avg, df_2019_avg, df_2020_avg]), fit_reg=True)
g.fig.set_size_inches(15, 8)
plt.show()