使用Seaborn绘制多元正态分布报TypeError,请求技术解决方案
解决Seaborn绘制多元正态分布的kdeplot报错问题
错误原因
你遇到的TypeError是因为Seaborn新版本(0.11.0及以后)的kdeplot()不再支持直接传入两个位置参数,必须通过关键字参数x和y来指定二维数据的两个维度。
修复方案
有两种简单的修复方式:
方式1:显式指定x、y关键字参数
直接给kdeplot()传入x和y参数,替换原来的位置参数写法:
import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 设置均值和协方差 mean1 = [0, 0] mean2 = [2, 0] cov1 = [[1, .7], [.7, 1]] cov2 = [[.5, .4], [.4, .5]] # 生成多元正态分布数据 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], alpha=0.5) plt.scatter(data2[:,0], data2[:,1], alpha=0.5) # 修复kdeplot调用方式,指定x和y参数 sns.kdeplot(x=data1[:, 0], y=data1[:, 1], levels=20, linewidths=1, color='k', alpha=0.2) sns.kdeplot(x=data2[:, 0], y=data2[:, 1], levels=20, linewidths=1, color='k', alpha=0.2) plt.grid(False) plt.show()
方式2:将数据转为DataFrame(更符合Seaborn风格)
把numpy数组转为pandas DataFrame,通过data参数传入,同时指定列名:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns mean1 = [0, 0] mean2 = [2, 0] cov1 = [[1, .7], [.7, 1]] cov2 = [[.5, .4], [.4, .5]] data1 = np.random.multivariate_normal(mean1, cov1, size=1000) data2 = np.random.multivariate_normal(mean2, cov2, size=1000) # 转为DataFrame df1 = pd.DataFrame(data1, columns=['x', 'y']) df2 = pd.DataFrame(data2, columns=['x', 'y']) plt.figure(figsize=(10,6)) plt.scatter(df1['x'], df1['y'], alpha=0.5) plt.scatter(df2['x'], df2['y'], alpha=0.5) # 使用data参数调用kdeplot sns.kdeplot(data=df1, x='x', y='y', levels=20, linewidths=1, color='k', alpha=0.2) sns.kdeplot(data=df2, x='x', y='y', levels=20, linewidths=1, color='k', alpha=0.2) plt.grid(False) plt.show()
额外说明
- 原代码中
linewidth参数在新版本Seaborn中应改为linewidths(复数形式),否则会触发警告。 - 给散点图加上
alpha=0.5可以让重叠部分更清晰,提升可视化效果。
内容的提问来源于stack exchange,提问作者Khaled Saleh
相关产品推荐
相关产品推荐

