Seaborn:如何用多个折线图制作子图?sns.relplot 似乎不支持?

Pyt*_*ous 5 python matplotlib seaborn

seaborn 文档区分了图形级函数和轴级函数:https://seaborn.pydata.org/introduction.html#figure-level-and-axes-level-functions

我知道像 sns.boxplot 这样的函数可以将轴作为参数,因此可以在子图中使用。

但是 sns.relplot() 怎么样?有没有办法把它放到子图中?

更一般地说,有什么方法可以让seaborn在子图中生成线图吗?

例如,这不起作用:

fig,ax=plt.subplots(2)
sns.relplot(x,y, ax=ax[0])
Run Code Online (Sandbox Code Playgroud)

因为 relplot 不将轴作为参数。

She*_*ore 2

嗯,那不是真的。您确实可以将轴对象传递给relplot. 以下是一个最小的答案。这里的关键点是关闭返回的空轴对象relplot。然后,您还可以使用ax[0]ax[1]向各个子图添加其他曲线,就像使用 一样matplotlib

import seaborn as sns
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2)

xdata = np.arange(50)

sns.set(style="ticks")
tips = sns.load_dataset("tips")
g1 = sns.relplot(x="total_bill", y="tip", hue="day", data=tips, ax=ax[0])
g2 = sns.relplot(x="total_bill", y="tip", hue="day", data=tips, ax=ax[1])

# Now you can add any curves to individual axis objects 
ax[0].plot(xdata, xdata/5) 

# You will have to close the additional empty figures returned by replot
plt.close(g1.fig)
plt.close(g2.fig) 
plt.tight_layout()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您还可以仅使用seabornas制作线图

import seaborn as sns
import numpy as np

x = np.linspace(0, 5, 100)
y = x**2

ax = sns.lineplot(x, y)
ax.set_xlabel('x-label')
ax.set_ylabel('y-label') 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 我也没有投反对票,但我可以想象这样做的论据如下:“relplot”是一个图形级别的seaborn函数。它的目的是创建一个由多个线图或散点图组成的 FacetGrid。现在,如果您在该网格中只有一个轴,则无论如何都不需要“relplot”,您可以(应该)直接使用“lineplot”或“scatterplot”。如果网格中有多个轴,则该解决方案无论如何都不起作用,因为“ax”本身不是“relplot”的参数,而是底层线图或散点图函数的参数。 (3认同)
  • `用户警告:relplot 是图形级函数,不接受目标轴。您可能希望尝试散点图 warnings.warn(msg, UserWarning)` (3认同)