matplotlib seaborn 数据可视化(4)——2维数据表面描点图

import math
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.image import NonUniformImage
%matplotlib

#幅度系数
A = 4
#均值
mu = np.array([1, 1])
#方差
cov = np.array([[2, 0],[0, 2]])
cov_inverse = np.linalg.inv(cov)
#生成模型
#按步长取点,以均值为中心,正负2个方差为范围
x = np.arange(mu[0]-2*cov.max(),mu[0]+2*cov.max(),step)
y = np.arange(mu[1]-2*cov.max(),mu[1]+2*cov.max(),step)
#合成绘图面
X,Y = np.meshgrid(x,y)
#按解析表达式计算
Z =A* 1/np.sqrt(2*math.pi*np.linalg.det(cov)) * np.exp(-1/2*(
    (X-mu[0])**2*cov_inverse[0,0]
    +(Y-mu[1])**2*cov_inverse[1,1]
    +(X-mu[0])*(Y-mu[1])*cov_inverse[0,1]
    +(Y-mu[1])*(X-mu[0])*cov_inverse[1,0]
))
#指定成像参数
#索引步长
step=0.05
#透明系数
alpha = 0.6
#侧面等高线层数
xylevel = 50
#底层等高线层数
zlevel=int(len(x)/(2*step*100))
#坐标轴标识字体大小
label_size=16
#标题字体大小
title_size=int(1.5*label_size)
#设定画板
fig = plt.figure(6,figsize=(10,10))
#指定为3d模型
ax = fig.add_subplot(111,projection='3d')
#绘制表面
surface = ax.plot_surface(X,Y,Z,cmap='jet',alpha=alpha)
#显示颜色板
fig.colorbar(surface,shrink=0.8,aspect=10)
#设定坐标轴范围
ax.set_xlim(mu[0]-2*cov.max(),mu[0]+2*cov.max())
ax.set_ylim(mu[1]-2*cov.max(),mu[1]+2*cov.max())
ax.set_zlim(-np.around(Z.max(),decimals=2),np.around(Z.max(),decimals=2))
#绘制侧面、底面等高线
ax.contour(X,Y,Z,zdir='x',offset=X.min(),levels=xylevel)
ax.contour(X,Y,Z,zdir='y',offset=Y.max(),levels=xylevel)
ax.contour(X,Y,Z,zdir='z',offset=-Z.max(),cmap='jet',alpha=alpha,levels=zlevel)
ax.contourf(X,Y,Z,zdir='z',offset=-Z.max(),cmap='jet',alpha=alpha,levels=zlevel)
#显示坐标轴标识
ax.set_xlabel('x',fontsize=label_size)
ax.set_ylabel('y',fontsize=label_size)
ax.set_zlabel('z',fontsize=label_size)
#设定标题
ax.set_title(r"$Z=\frac{1}{\sqrt{2\pi \det(\Sigma)}}\exp\left\{ -\frac{1}{2}\left[ (x-\mu)^\top \Sigma^{-1} (x-\mu)\right]\right\}$",fontsize=title_size)
plt.show()

你可能感兴趣的:(数据可视化,python,matplotlib,可视化,数据可视化,机器学习)