Seaborn agrega una leyenda automáticamente cuando asignas una variable a hue, style o size. La leyenda se puede personalizar con la función sns.move_legend, disponible desde seaborn 0.11.2, y con los métodos de la leyenda de matplotlib.
Agrupar los datos con hue crea una leyenda con un elemento por grupo. El título de la leyenda es el nombre de la columna.
import seaborn as sns
import matplotlib.pyplot as plt
mpg = sns.load_dataset("mpg")
sns.scatterplot(data = mpg, x = "horsepower", y = "mpg", hue = "origin")
# plt.show()

move_legend
sns.move_legend cambia la posición de una leyenda existente. Su primer argumento son los ejes (o el objeto que devuelve una función a nivel de figura) y el segundo la posición, con los mismos valores que en matplotlib: "upper left", "lower right", "center"…
import seaborn as sns
import matplotlib.pyplot as plt
mpg = sns.load_dataset("mpg")
ax = sns.scatterplot(data = mpg, x = "horsepower", y = "mpg", hue = "origin")
sns.move_legend(ax, "lower left")
# plt.show()

Leyenda fuera del gráfico
Utiliza bbox_to_anchor para colocar la leyenda fuera del gráfico. El siguiente ejemplo coloca la esquina superior izquierda de la leyenda junto a la esquina superior derecha de los ejes.
import seaborn as sns
import matplotlib.pyplot as plt
mpg = sns.load_dataset("mpg")
ax = sns.scatterplot(data = mpg, x = "horsepower", y = "mpg", hue = "origin", s = 50)
sns.move_legend(ax, "upper left", bbox_to_anchor = (1, 1),
title = "Origen", fontsize = 12, title_fontsize = 13)
# plt.show()

Leyenda debajo del gráfico
Para una leyenda horizontal debajo del gráfico establece ncol igual al número de grupos y elimina el borde con frameon = False.
import seaborn as sns
import matplotlib.pyplot as plt
mpg = sns.load_dataset("mpg")
ax = sns.scatterplot(data = mpg, x = "horsepower", y = "mpg", hue = "origin")
sns.move_legend(ax, "upper center", bbox_to_anchor = (0.5, -0.15),
ncol = 3, title = None, frameon = False)
# plt.show()

move_legend también admite cualquier argumento de la función legend de matplotlib, como title, fontsize o title_fontsize.
import seaborn as sns
import matplotlib.pyplot as plt
mpg = sns.load_dataset("mpg")
ax = sns.scatterplot(data = mpg, x = "horsepower", y = "mpg", hue = "origin")
sns.move_legend(ax, "upper right", title = "Origen",
fontsize = 9, title_fontsize = 11)
# plt.show()

Cambiar las etiquetas
Las etiquetas de la leyenda son los valores de la columna de agrupación. La forma más sencilla de cambiarlas es renombrar los valores de los datos antes de representarlos, por ejemplo con replace.
import seaborn as sns
import matplotlib.pyplot as plt
mpg = sns.load_dataset("mpg")
mpg["origin"] = mpg["origin"].replace({"usa": "EE. UU.", "europe": "Europa", "japan": "Japón"})
sns.scatterplot(data = mpg, x = "horsepower", y = "mpg", hue = "origin")
# plt.show()

Las funciones a nivel de figura (relplot, displot, catplot…) colocan la leyenda fuera del gráfico por defecto. Pasa el objeto que devuelven a move_legend para cambiarla, o establece legend_out = False mediante facet_kws para dibujarla dentro del gráfico.
import seaborn as sns
import matplotlib.pyplot as plt
mpg = sns.load_dataset("mpg")
g = sns.displot(data = mpg, x = "mpg", hue = "origin",
kind = "kde", fill = True, height = 4)
sns.move_legend(g, "upper right", bbox_to_anchor = (0.95, 0.95))
# plt.show()

Cuando hue o size es una variable numérica seaborn solo muestra algunos valores representativos (legend = "brief"). Utiliza legend = "full" para mostrar todos los valores.
import seaborn as sns
import matplotlib.pyplot as plt
mpg = sns.load_dataset("mpg")
sns.scatterplot(data = mpg, x = "horsepower", y = "mpg",
hue = "cylinders", size = "cylinders", legend = "full")
# plt.show()

Establece legend = False en la función de seaborn para crear el gráfico sin leyenda. Si el gráfico ya está creado elimínala con ax.get_legend().remove().
import seaborn as sns
import matplotlib.pyplot as plt
mpg = sns.load_dataset("mpg")
sns.scatterplot(data = mpg, x = "horsepower", y = "mpg", hue = "origin",
legend = False)
# plt.show()

Como seaborn está construido sobre matplotlib también puedes utilizar todas las opciones de la leyenda en matplotlib. Consulta también cómo personalizar los ejes y los títulos de los gráficos de seaborn.
También te puede interesar