将 ax.twinx() 与 sns.FacetGrid 和 sns.lineplot 结合使用

Car*_*ang 1 matplotlib python-3.x pandas seaborn

我试图在每个方面图上应用共享的 x 轴,'total_bill'左侧 y 轴和'tip'右侧 y 轴。使用tips数据框进行演示。

tip使用以下数据集:

import pandas as pd
import numpy as np
from datetime import datetime, timedelta

date_today= datetime.now()
days = pd.date_range(date_today, date_today + timedelta(tips.shape[0]-1), freq='D')
tips = sns.load_dataset("tips")
tips['date'] = days
Run Code Online (Sandbox Code Playgroud)

数据集预览:

tips.head()
Run Code Online (Sandbox Code Playgroud)
总帐单 提示 性别 吸烟者 时间 尺寸 日期
0 16.99 1.01 女性 太阳 晚餐 2 2021-01-19 16:39:38.363600
1 10.34 1.66 男性 太阳 晚餐 3 2021-01-20 16:39:38.363600
2 21.01 3.5 男性 太阳 晚餐 3 2021-01-21 16:39:38.363600
3 23.68 3.31 男性 太阳 晚餐 2 2021-01-22 16:39:38.363600
4 24.59 3.61 女性 太阳 晚餐 4 2021-01-23 16:39:38.363600

我努力了

g = sns.FacetGrid(tips, row='smoker', col='time')
g.map(sns.lineplot, 'date', 'tip', color='b')
for ax in g.axes.flat:
    ax.twinx()
    for label in ax.get_xticklabels():
        label.set_rotation(60)
g.map(sns.lineplot, 'date', 'total_bill', color='g')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我无法找出将 传递ax.twinx()到辅助右 y 轴图的最佳方法'tip'

我希望实现的目标:

Asns.FacetGrid()sns.lineplots 所在的特征;'total_bill'在左侧 y 轴上,'tip'在右侧 y 轴上。绿线代表'total_bill'波动,蓝线代表'tip'每个相应 y 轴特征尺度的波动。

Diz*_*ahi 5

您需要创建一个自定义绘图函数来创建双轴并在这个新创建的轴上绘制所需的输出:

def twin_lineplot(x,y,color,**kwargs):
    ax = plt.twinx()
    sns.lineplot(x=x,y=y,color=color,**kwargs, ax=ax)

g = sns.FacetGrid(tips, row='smoker', col='time')
g.map(sns.lineplot, 'date', 'tip', color='b')
g.map(twin_lineplot, 'date', 'total_bill', color='g')
g.fig.autofmt_xdate()
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述