FacetGrid не отображает легенду для диаграммы

Скажем, у меня есть следующий фрейм данных 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.displot(data=df_melt, kind='hist', x = "value", col = "variable", ...)? Обычно лучше всего работают определенные функции сетки (sns.catplot, sns.relplot, ...). При прямом вызове sns.FacetGrid необходимо учитывать некоторые внутренние особенности, которые часто не интуитивно понятны.

JohanC 22.02.2024 18:09

Это сработало безупречно. Большое спасибо за помощь! Я не знал, что sns.FacetGrid не предназначен для прямого вызова. Если вы оставите свой комментарий в качестве ответа, я могу пометить его как принятое решение.

Linus Wagner 22.02.2024 19:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Документация 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()

Другие вопросы по теме