Скажем, у меня есть следующий фрейм данных Pandas:
import pandas as pd
import seaborn as sns
import numpy as np
df1 = pd.DataFrame({
"kind": "used",
"val1": np.random.rand(100),
"val2": np.random.rand(100),
})
df1.loc[0:50, "kind"] = "unused"
df_melt = pd.melt(df1, id_vars = "kind", value_vars=["val1", "val2"])
Кадр данных df_melt теперь должен оказаться в FacetGrid, где каждый график представляет собой гистограмму одного из значений (т. е. val1 и val2). На графике столбец kind следует использовать в качестве оттенка, чтобы мы получили две группы (используемые и неиспользуемые элементы).
Эти группы должны быть показаны в легенде где-нибудь в сюжете.
g = sns.FacetGrid(df_melt, col = "variable")
g.map_dataframe(sns.histplot, x = "value", log_scale=True, hue = "kind", legend=True)
который дает:
Однако, как видите, никакой легенды не строится. g._legend_data тоже пусто.
Как мне заставить Seaborn показывать легенду для моего сюжета?
Это сработало безупречно. Большое спасибо за помощь! Я не знал, что sns.FacetGrid не предназначен для прямого вызова. Если вы оставите свой комментарий в качестве ответа, я могу пометить его как принятое решение.






Документация Seaborn FacetGrid содержит предупреждение в цветной рамке:
При использовании функций seaborn, которые выводят семантические сопоставления из набора данных, необходимо позаботиться о синхронизации этих сопоставлений между фасетами (например, путем определения сопоставления оттенков с помощью словаря палитры или установки типа данных переменных в категорию). В большинстве случаев лучше использовать функцию уровня фигуры (например, replot() или catplot()), чем напрямую использовать FacetGrid.
Для гистограмм вы можете использовать sns.displot для создания сетки. Он сочетает в себе большинство параметров sns.FacetGrid и sns.histplot.
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
df1 = pd.DataFrame({
"kind": "used",
"val1": np.random.rand(100),
"val2": np.random.rand(100),
})
df1.loc[0:50, "kind"] = "unused"
df_melt = pd.melt(df1, id_vars = "kind", value_vars=["val1", "val2"])
sns.displot(data=df_melt, kind='hist', x = "value", col = "variable", log_scale=True, hue = "kind", legend=True)
plt.show()
Пробовали
sns.displot(data=df_melt, kind='hist', x = "value", col = "variable", ...)? Обычно лучше всего работают определенные функции сетки (sns.catplot,sns.relplot, ...). При прямом вызовеsns.FacetGridнеобходимо учитывать некоторые внутренние особенности, которые часто не интуитивно понятны.