jointplot
Con la función jointplot es inmediato crear un gráfico de dispersión (y otros tipos de gráficos) con histogramas marginales. Tendrás que pasar tus datos a la función para crear la visualización.
import seaborn as sns
df = sns.load_dataset("penguins")
sns.jointplot(data = df,
x = "bill_length_mm",
y = "bill_depth_mm")

Una alternativa a la función jointplot es JointGrid, que proporciona mayor flexibilidad, en caso de ser neceasaria. jointgrid es un wrapper de esa función.
import seaborn as sns
df = sns.load_dataset("penguins")
ax = sns.JointGrid(data = df,
x = "bill_length_mm",
y = "bill_depth_mm")
ax.plot(sns.scatterplot, sns.histplot)

Agregar una recta de regresión y densidades
La función proporciona un argumento llamado kind que permite seleccionar entre distintos tipos de gráficos. Las posibles opciones son "scatter" (por defecto), "kde", "hist", "hex", "reg" y "resid".
import seaborn as sns
df = sns.load_dataset("penguins")
sns.jointplot(data = df,
x = "bill_length_mm",
y = "bill_depth_mm",
kind = "reg") #Agrega recta de regresión y densidades

Símbolos
Los símbolos utilizados para representar las observaciones de un gráfico de dispersión se pueden personalizar con el argumento marker.
import seaborn as sns
df = sns.load_dataset("penguins")
sns.jointplot(data = df,
x = "bill_length_mm",
y = "bill_depth_mm",
marker = "x")

Mostrar los ejes de los gráfios marginales
Si quieres que se muestren los ejes de los histogramas marginales puedes establecer el argumento marginal_ticks como True.
import seaborn as sns
df = sns.load_dataset("penguins")
sns.jointplot(data = df,
x = "bill_length_mm",
y = "bill_depth_mm",
marginal_ticks = True)

Tamaño de los gráficos marginales
Por defecto, el gráfico principal es 5 veces más grande que los gráficos marginales. Puedes cambiar la relación de tamaños con ratio. Ten en cuenta que este argumento solo acepta números enteros.
import seaborn as sns
df = sns.load_dataset("penguins")
# Gráfico de dispersión dos veces más grande que los histogramas
sns.jointplot(data = df,
x = "bill_length_mm",
y = "bill_depth_mm",
ratio = 2)


Por último, también es posible personalizar los colores. Si quieres que tanto los histogramas como los puntos del gráfico de dispersión tengan el mismo color, pasa el color elegido a color.
import seaborn as sns
df = sns.load_dataset("penguins")
sns.jointplot(data = df,
x = "bill_length_mm",
y = "bill_depth_mm",
color = "lavender")

Sin embargo, si prefieres tener colores diferentes para los histogramas puedes pasar un diccionario al argumento marginal_kws y seleccionar el color que quieras. Ten en cuenta que este argumento también se puede utilizar para personalizar otros argumentos relacionados con los histogramas.
import seaborn as sns
df = sns.load_dataset("penguins")
sns.jointplot(data = df,
x = "bill_length_mm",
y = "bill_depth_mm",
color = "dimgray",
marginal_kws = dict(color = "lavender"))
También te puede interesar