将线图添加到 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('')
这是结果:
我使用 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('')
这是结果: