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
开始。
我遇到了一个问题,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
开始。