将线图添加到 Facetgrid 图

Add line plots to Facetgrid plot

我使用 Seaborn 绘制了一个简单的 RelPlot,它返回了一个 Facetgrid 对象。 我使用的代码如下:

import seaborn as sns

palette = sns.color_palette("rocket_r")

g1 = sns.relplot(
    data=df,
    x="number_of_weeks", y="avg_streams",
    hue="state", col="state",
    kind="line", palette=palette,
    height=5, aspect=1, facet_kws=dict(sharex=False), col_wrap=3, 
)

其中显示了以下情节:

我使用的 Dataframe 具有以下结构:

   avg_streams  date    year number_of_weeks state
4   0.104011    31-01   2020    4   it
5   1.211951    07-02   2020    5   it
6   0.559374    14-02   2020    6   it
7   0.304257    21-02   2020    7   it
8   0.199218    28-02   2020    8   it
... ... ... ... ... ...
175 -0.938890   26-06   2020    25  br
176 -0.483821   03-07   2020    26  br
177 -0.083704   10-07   2020    27  br
178 0.165312    17-07   2020    28  br
179 0.218601    24-07   2020    29  br

我想将其他线图添加到单个子图中。我的最终目标是绘制每个子图中的所有线条,但突出显示每个不同子图中的不同状态。

所以我想在我的 Facetgrid 中为每个不同的子图得到这样的东西:

这是我为上一个情节编写的代码:

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

palette = {c:'red' if c=='it' else 'grey' for c in df.state.unique()}

fig, ax = plt.subplots(figsize=(15, 7))    
plot=sns.lineplot(ax=ax,x="number_of_weeks", y="avg_streams", hue="state", data=df, palette=palette)

lines = ax.get_lines()
lines[0].set_linewidth(5)

plot.set(title='Streams trend')

但我不知道如何“合并”这两个地块。我怎样才能实现我的目标?

编辑:我试图“手动”添加绘图,选择我的 Facetgrid 的单轴。我关注了这个问题: 并且我能够添加一个简单的行。

这是我的尝试,我试图在我已经存在的情节中添加一条简单的线:

palette = sns.color_palette("rocket_r")

g1 = sns.relplot(
    data=df,
    x="number_of_weeks", y="avg_streams",
    hue="state", col="state",
    kind="line", palette=palette,
    height=5, aspect=1, facet_kws=dict(sharex=False), col_wrap=3, 
)
axes = g1.fig.axes
print(axes)

axes[0].plot([20, 30], [40, 50], 'k-')

我找到了解决办法,代码如下:

import seaborn as sns

palette = sns.color_palette("tab10",6)

g1 = sns.relplot(
    data=df,
    x="number_of_weeks", y="avg_streams",
    hue="state", col="state",
    kind="line", palette=palette,
    height=5, aspect=1, facet_kws=dict(sharex=False), col_wrap=3, linewidth=5, zorder= 5
)
axes = g1.fig.axes
states = df.state.unique()

for index, state in enumerate (states, start=0):
    df_temp = df.loc[df['state'] != state]
    palette1 = {c:'grey' for c in df_temp.state.unique()}
    sns.lineplot(ax=axes[index],x="number_of_weeks", y="avg_streams", hue="state", data=df_temp, palette=palette1)
    axes[index].get_legend().remove()
    axes[index].set_xlabel('')

    

这是结果: