Как вывести легенду через plt.legend()
Как вывести легенду через plt.legend() (не используя Legend=True, в самом histplot, потому что тогда создаётся легенда для каждого элемента ax, а нужна общая легенда для figure).
Легенда должна быть точно такая же как если бы в sns.histplot() добавить параметр Legend=True, т.е. легенда рисуется по значению hue.
Но с той оговоркой что она должна быть одна.
А так получается из-за того, что sns.histplot() строится в цикле то и легенды получается 3.
Выдаёт следующую ошибку
No handles with labels found to put in legend.
main.py
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame({"Q" : [5, 5, 1, 8, 2, 3, 2, 9, 1, 3],
"Total_traffic": [775.48846,
861.96324,
261.1186,
179.18564,
351.99208,
416.67461,
448.88413,
550.44581,
783.64464,
455.97369],
"Downlink": [360.13,
3023.54,
790.96,
2590.97,
731.61,
1346.89,
438.27,
3428.69,
1786.99,
610.43]})
feature = ["Q", "Total_traffic", "Downlink"]
fig, ax = plt.subplots(3, 1, figsize=(20,15))
counter = 0
for i in range(3):
sns.histplot(data=df, x=feature[counter], hue="Q", multiple="stack", bins=100, legend=False,
ax=ax[i])
counter+=1
plt.legend(loc='upper right')
plt.tight_layout()
plt.suptitle('Распределение численных данных', y=1.05, fontsize=18)
plt.show()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте так:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
df = pd.DataFrame({
"Q" : [5, 5, 1, 8, 2, 3, 2, 9, 1, 3],
"Total_traffic": [
775.48846,
861.96324,
261.1186,
179.18564,
351.99208,
416.67461,
448.88413,
550.44581,
783.64464,
455.97369],
"Downlink": [
360.13,
3023.54,
790.96,
2590.97,
731.61,
1346.89,
438.27,
3428.69,
1786.99,
610.43]
})
feature = ["Q", "Total_traffic", "Downlink"]
fig, ax = plt.subplots(3, 1, figsize=(10, 6))
counter = 0
for i in range(3):
sns.histplot(
data=df,
x=feature[counter],
hue="Q",
element="step", # +++
multiple="stack",
bins=100,
# legend=False, # ---
ax=ax[i]
)
legend = ax[i].get_legend() # +++
handles = legend.legendHandles # +++
legend.remove() # +++
counter+=1
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
ax[i].legend(
handles,
['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'],
title='Legend Q'
)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
plt.show()
