【问题标题】:seaborn implot combine datasets into one plotseaborn implot 将数据集合并到一个图中
【发布时间】:2021-11-19 23:06:23
【问题描述】:

这可能是一个愚蠢的问题,但我有多个情节冗余的代码,这些代码都是基于熊猫数据帧中一年的时间序列数据。是否可以将这些组合成一个图,但每一年的数据(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)}')

【问题讨论】:

    标签: python pandas matplotlib seaborn data-visualization


    【解决方案1】:

    您可以添加一个额外的列来包含年份并将数据框连接起来形成一个大数据框。然后你可以使用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()
    

    【讨论】:

    • 非常感谢
    【解决方案2】:

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

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

    然后将每个表组合成一个数据框

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

    【讨论】:

      【解决方案3】:

      如果您接受使用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增强

      【讨论】:

      • 您可以使用for day, df in tips.groupby('day'): sns.regplot(x="total_bill", y="tip", data=df, ax=ax, label=day)ax.legend() 将不同的数据集标记为图例。
      • 好主意!我根据您的评论更新了我的帖子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 2011-10-28
      相关资源
      最近更新 更多