Как создать одну легенду для всех подграфиков в sns.histplot без повторяющихся меток?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как создать одну легенду для всех подграфиков в sns.histplot без повторяющихся меток?

Сообщение Anonymous »

У меня есть фрейм данных, который я рисую с помощью sns.histplot, чтобы создать ~9 подграфиков. Я не хочу, чтобы на фигурке было 9 легенд. Мне нужна одна легенда для всей фигуры, поскольку большинство легенд в любом случае идентичны. Однако, поскольку не все подграфики идентичны на 100 % (у некоторых есть лишний «обрезок» или он отсутствует), я не могу просто удалить все легенды, кроме 1.
Я смог сделать это для sns.barplot, но те же строки кода, похоже, не работают с sns.histplot (а эти данные необходимо отображать с помощью sns.histplot).
У меня есть фиктивный код ниже, с которым можно повозиться. Я закомментировал строки, которые я

Код: Выделить всё

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# Create a dummy DataFrame with random data

crops = [
"apple",
"banana",
"orange",
"potato",
"zucchini",
"kale",
"strawberry",
"raspberry",
"turnip",
"onion",
]
farms = [
"n",
"s",
"e",
"w",
]

np.random.seed(42)
n_samples = 100
counts = np.random.randint(1, 200, size=n_samples)
choices = np.random.choice(crops, size=n_samples)
locations = np.random.choice(farms, size=n_samples)

df = pd.DataFrame({"counts": counts, "crops": choices, "farms": locations})

fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)

h = []  # Initialize an empty list to collect handles
l = []  # Initialize an empty list to collect labels

rowindex = [0, 0, 1, 1]
colindex = [0, 1, 0, 1]

selection = ["farms == 'n'", "farms == 's'", "farms == 'e'", "farms == 'w'"]

for row, col, sele in zip(rowindex, colindex, selection):
g = sns.histplot(
data=df.query(sele),
x="counts",
kde=True,
stat="count",
hue="crops",  # Add the hue parameter
ax=axes[row, col],
)

handles, labels = g.get_legend_handles_labels()
h.extend(handles)
l.extend(labels)
axes[row, col].get_legend().remove()  # Remove individual legends from subplots

# Create a single legend for the entire figure
by_label = dict(zip(l, h))
g.legend(by_label.values(), by_label.keys(), bbox_to_anchor=(0.9,0.65), loc='upper right')

plt.show()
Следующими строками я пытаюсь собрать все легенды из каждого подграфика и бросить их в handles[] и labels[], чтобы затем превратить их в словарь (чтобы удалить дубликаты записи). Я пробовал g.get_legend_handles_labels() и axes[row,col].get_legend_handles_labels() и fig., ax., но все оказывается пустым когда я печатаю содержимое ручек и этикеток. Я действительно в замешательстве, потому что это работало с sns.barplot (но, может быть, они определяют исполнителей по-другому? или хранят их по-другому?).

Код: Выделить всё

handles, labels = g.get_legend_handles_labels()
h.extend(handles)
l.extend(labels)
axes[row, col].get_legend().remove()  # Remove individual legends from subplots

# Create a single legend for the entire figure
by_label = dict(zip(l, h))
g.legend(by_label.values(), by_label.keys(), bbox_to_anchor=(0.9,0.65), loc='upper right')
Комментируя эти строки, вот сюжет:
[img]https://i .sstatic.net/IqKXMNWk.png[/img]

С этими строками в коде у меня нет легенд:
Изображение

В идеале у меня должна быть одна легенда (вне сюжета) со всеми «культуры» перечислены один раз (порядок не важен). Кто-нибудь знает, что я делаю не так?

Как уже упоминалось, это РАБОТАЕТ с sns.barplot. Если вы измените бит g = на это:

Код: Выделить всё

g = sns.barplot(
data=df.query(sele),
x="counts",
y="counts",
hue="crops",  # Add the hue parameter
ax=axes[row, col],
)
Оставив все остальное таким же, тогда я получу фигуру, подобную приведенной ниже, что, по сути, и есть то, к чему я стремлюсь: 1 легенда со всеми «культурами», перечисленными только один раз с их соответствующий маркер метки. Значит, это должно быть возможно с помощью sns.histplot.... верно?
Изображение


Подробнее здесь: https://stackoverflow.com/questions/787 ... plicate-la
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Какова синтаксическая ошибка в этом коде Python sns.histplot? [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Matplotlib — исправление гистограммы с использованием подграфиков и вставкой меток для каждого столбца.
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Как иметь одну цветовую панель для всех подграфиков
    Anonymous » » в форуме Python
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • Seaborn 2d histplot: показать количество в каждой ячейке
    Anonymous » » в форуме Python
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • Обеспечение соблюдения меток меток matplotlib не шире осей
    Anonymous » » в форуме Python
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»