FacetGrid 返回 seaborn 的 replot 不尊重色调

FacetGrid returned seaborn's relplot does not respect hue

我遇到了一个问题,seaborn 的 relplot 函数创建的 FacetGrid 与手动创建的 FacetGrid 不同。我发现这不直观,希望 relplot 函数给我一个 FacetGrid,它的行为类似于手动创建的

问题是,当在从 relplot 返回的 FacetGrid 上使用 map 函数时,它不再考虑指定的色调。这是一个解释我的观点的最小示例:

import numpy as np
import seaborn as sns
import pandas as pd

def foo(color=None, label=None, tag=None):
    print(tag, color, label)

x = np.random.randn(100)
df = pd.DataFrame({
    'x' : x,
    'y' : 2 * x,
    'row' : np.random.randn(x.shape[0]) > 0,
    'col' : np.random.randn(x.shape[0]) > 0,
    'hue' : np.random.randn(x.shape[0]) > 0,
})
g = sns.relplot(data = df, x = 'x', y = 'y', row='row', col='col', hue='hue')
g.map(foo, tag='relplot')

g2 = sns.FacetGrid(data = df, row = 'row', col = 'col', hue='hue')
g2.map(foo, tag='FacetGrid')

relplot 返回的分面网格上调用 map 函数时,它只会被调用四次(每行和每列一次),但不会尊重我还指定的事实一种色调。输出为:

relplot (0.2980392156862745, 0.4470588235294118, 0.6901960784313725) None
relplot (0.2980392156862745, 0.4470588235294118, 0.6901960784313725) None
relplot (0.2980392156862745, 0.4470588235294118, 0.6901960784313725) None
relplot (0.2980392156862745, 0.4470588235294118, 0.6901960784313725) None

如果我将相同的函数映射到手动创建的 FacetGrid,它将导致预期的行为:

FacetGrid (0.2980392156862745, 0.4470588235294118, 0.6901960784313725) False
FacetGrid (0.8666666666666667, 0.5176470588235295, 0.3215686274509804) True
FacetGrid (0.2980392156862745, 0.4470588235294118, 0.6901960784313725) False
FacetGrid (0.8666666666666667, 0.5176470588235295, 0.3215686274509804) True
FacetGrid (0.2980392156862745, 0.4470588235294118, 0.6901960784313725) False
FacetGrid (0.8666666666666667, 0.5176470588235295, 0.3215686274509804) True
FacetGrid (0.2980392156862745, 0.4470588235294118, 0.6901960784313725) False
FacetGrid (0.8666666666666667, 0.5176470588235295, 0.3215686274509804) True

对于为什么会发生这种情况有任何解释吗?有没有办法改变 relplot 的行为以匹配预期的行为,即遵守我设置的 hue 参数?

Is there any explanation as to why that happens?

是的,在 relplot 中,hue 逻辑全部在 scatterplot 中处理,而不是由 FacetGrid

Is there a way to change relplot's behaviour to match the expected one?

不,在这种情况下,您需要让自定义函数在内部处理色调逻辑或直接从 FacetGrid 开始。