Fügen Sie dem 2D-Histogramm des Meeresgeborenen eine Normalverteilung hinzu

Nov 27 2020

Ist es möglich, ein Histogramm von Seaborn zu erstellen und eine Normalverteilung hinzuzufügen?

Angenommen, ich hätte so etwas wie dieses Streudiagramm und Histogramm aus der Dokumentation.

import seaborn as sns
penguins = sns.load_dataset("penguins")
sns.jointplot(data=penguins, x="bill_length_mm", y="bill_depth_mm");
plt.savefig('deletethis.png', bbox_inches='tight')

Kann ich eine Verteilung auf den Seiten wie im Bild unten überlagern?

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm

x = np.random.normal(size=100000)

# Plot histogram in one-dimension
plt.hist(x,bins=80,density=True)
xvals = np.arange(-4,4,0.01)
plt.plot(xvals, norm.pdf(xvals),label='$N(0,1)$')
plt.legend();

Antworten

2 RuthgerRighart Nov 27 2020 at 21:40

Im Folgenden finden Sie eine Schätzung der Kerneldichte, in der die Verteilung angezeigt wird (und ob dies normal ist):

g = sns.JointGrid(data=penguins, x="bill_length_mm", y="bill_depth_mm")
g.plot_joint(sns.scatterplot, s=100, alpha=.5)
g.plot_marginals(sns.histplot, kde=True)

Das Folgende überlagert eine Normalverteilung der Histogramme in den Achsen.

import seaborn as sns
import numpy as np
import pandas as pd
from scipy.stats import norm

df1 = penguins.loc[:,["bill_length_mm", "bill_depth_mm"]]

axs = sns.jointplot("bill_length_mm", "bill_depth_mm", data=df1)
axs.ax_joint.scatter("bill_length_mm", "bill_depth_mm", data=df1, c='r', marker='x')

axs.ax_marg_x.cla()
axs.ax_marg_y.cla()
sns.distplot(df1.bill_length_mm, ax=axs.ax_marg_x, fit=norm)
sns.distplot(df1.bill_depth_mm, ax=axs.ax_marg_y, vertical=True, fit=norm)