Search code examples
pythonseaborn

seaborn plot multivariate normal distribution


The following code tries to plot multivariate normal distribution using seaborn:

# Set the mean and covariance
mean1 = [0, 0]
mean2 = [2, 0]
cov1 = [[1, .7], [.7, 1]]
cov2 = [[.5, .4], [.4, .5]]

# Generate data from the mean and covariance
data1 = np.random.multivariate_normal(mean1, cov1, size=1000)
data2 = np.random.multivariate_normal(mean2, cov2, size=1000)

plt.figure(figsize=(10,6))

plt.scatter(data1[:,0],data1[:,1])
plt.scatter(data2[:,0],data2[:,1])

sns.kdeplot(data1[:, 0], data1[:, 1], levels=20, linewidth=10, color='k', alpha=0.2)
sns.kdeplot(data2[:, 0], data2[:, 1], levels=20, linewidth=10, color='k', alpha=0.2)

plt.grid(False)
plt.show()

it raises error: TypeError: kdeplot() takes from 0 to 1 positional arguments but 2 positional arguments (and 2 keyword-only arguments) were given

Kindy advise how can this be achieved? Best regards


Solution

  • The error tells you exactly what the problem is. Take a look at the function signature in the documentation:

    seaborn.kdeplot(data=None, *, x=None, y=None, ...)
    

    data can be passed as kwarg or positional argument, whereas arguments after * are kwargs only. You should therefore specify x= and y=:

    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # Set the mean and covariance
    mean1 = [0, 0]
    mean2 = [2, 0]
    cov1 = [[1, .7], [.7, 1]]
    cov2 = [[.5, .4], [.4, .5]]
    
    # Generate data from the mean and covariance
    data1 = np.random.multivariate_normal(mean1, cov1, size=1000)
    data2 = np.random.multivariate_normal(mean2, cov2, size=1000)
    
    plt.figure(figsize=(10,6))
    
    plt.scatter(data1[:,0],data1[:,1])
    plt.scatter(data2[:,0],data2[:,1])
    
    sns.kdeplot(x=data1[:, 0], y=data1[:, 1], levels=20, linewidth=10, color='k', alpha=0.2)
    sns.kdeplot(x=data2[:, 0], y=data2[:, 1], levels=20, linewidth=10, color='k', alpha=0.2)
    
    plt.grid(False)
    plt.show()