您的当前位置:首页正文

使用python绘制3维正态分布图的方法

来源:图艺博知识网
使⽤python绘制3维正态分布图的⽅法

今天使⽤python画了⼏个好玩的3D展⽰图,现在分享给⼤家。先贴上图⽚

使⽤的python⼯具包为:

from matplotlib import pyplot as pltimport numpy as np

from mpl_toolkits.mplot3d import Axes3D

在贴代码之前,有必要从整体上了解这些图是如何画出来的。可以把上⾯每⼀个3D图⽚理解成⼀个长⽅体。输⼊数据是三维的,x轴y轴和z轴。在第三个图⽚⾥⾯有x、y和z坐标的标识。在第三张图⽚中,我们可以理解为,z是随着x和y变化的函数。就像⼀个⼈在⼭丘地区⾛动⼀样,其中x和y表⽰的是⽅向,z表⽰的这个⼈在上坡还是下坡。第⼆张图⽚的中间那个,其实是⼀个3维的正态分布图。具体的公式为:

上⾯的是2维的,即只有x和y,如果是三维的话,需要⼀点变形,只需要在上⾯的公式基础之上把exp()⾥⾯改变为:exp(-((x-u)^2 + (y - u)^2)/(2q^2)), 这⾥的u表⽰平均值,q表⽰标准差。这样变化之后,z = f(x, y)。这就是z值的公式了,表⽰的是z值随着x和y值的变化⽽变化的函数。下⾯贴⼀下代码

这是第⼆张图⽚的代码。

from matplotlib import pyplot as pltimport numpy as np

from mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()ax = Axes3D(fig)len = 8;step = 0.4;

def build_layer(z_value):

x = np.arange(-len, len, step); y = np.arange(-len, len, step); z1 = np.full(x.size, z_value/2) z2 = np.full(x.size, z_value/2) z1, z2 = np.meshgrid(z1, z2) z = z1 + z2;

x, y = np.meshgrid(x, y) return (x, y, z);

def build_gaussian_layer(mean, standard_deviation): x = np.arange(-len, len, step); y = np.arange(-len, len, step); x, y = np.meshgrid(x, y);

z = np.exp(-((y-mean)**2 + (x - mean)**2)/(2*(standard_deviation**2))) z = z/(np.sqrt(2*np.pi)*standard_deviation); return (x, y, z);

# 具体函数⽅法可⽤ help(function) 查看,如:help(ax.plot_surface)x1, y1, z1 = build_layer(0.2);

ax.plot_surface(x1, y1, z1, rstride=1, cstride=1, color='green')x5, y5, z5 = build_layer(0.15);

ax.plot_surface(x5, y5, z5, rstride=1, cstride=1, color='pink')# x2, y2, z2 = build_layer(-0.26);

# ax.plot_surface(x2, y2, z2, rstride=1, cstride=1, color='yellow')#

# x6, y6, z6 = build_layer(-0.22);

# ax.plot_surface(x6, y6, z6, rstride=1, cstride=1, color='pink')# x4, y4, z4 = build_layer(0);

# ax.plot_surface(x4, y4, z4, rstride=1, cstride=1, color='purple')x3, y3, z3 = build_gaussian_layer(0, 1)

ax.plot_surface(x3, y3, z3, rstride=1, cstride=1, cmap='rainbow')plt.show()

这是第三张图⽚的代码

import numpy as np

import matplotlib.pyplot as pltimport mpl_toolkits.mplot3dx, y = np.mgrid[-1:1:20j, -1:1:20j]z = x * np.exp(-x ** 2 - y ** 2)

ax = plt.subplot(111, projection='3d')

ax.plot_surface(x, y, z, rstride=2, cstride=1, cmap=plt.cm.coolwarm, alpha=0.8)ax.set_xlabel('x')ax.set_ylabel('y')ax.set_zlabel('z')plt.show()

以上这篇使⽤python绘制3维正态分布图的⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top