python——繪制二元高斯分布的三維圖像,


  在對數據進行可視化的過程中,可能經常需要對數據進行三維繪圖,在python中進行三維繪圖其實是比較簡單的,下面我們將給出一個二元高斯分布的三維圖像案例,並且給出相關函數的參數。

  通常,我們繪制三維圖像經常需要如下步驟:

  1.生成二維的網格坐標數據,我們可以使用np.meshgrid(x, y)函數進行二維網格坐標的生成,該函數通過傳入的參數生成兩個坐標的網格數據,並且返回的數據具有如下的格式:

import numpy as np

t = np.linspace(1, 5, 5)
x, y = np.meshgrid(t,t)
print(x)
print(y)

  2.通過網格坐標,生成z軸上的網格坐標。得到了x,y的網格數據之后,我們需要根據x,y的數據的到z的網格數據,我們可以通過迭代將x,y進行拼接,形成列數為2的矩陣,並通過矩陣計算z的數據,計算之后,在將z的數據維度進行轉換,得到z的網格數據。

xy = np.stack([x.flat, y.flat], axis=1)
print(xy)
xy = np.stack([x.flat, y.flat], axis=1)
print(xy)
z = xy[:, 0] + xy[:, 1]
z = np.array(z)
z = z.reshape(x.shape)
print(z)

  3.獲取繪制3維圖像的句柄,調用相關函數進行繪制,繪制3維圖面ax.plot_surface(x, y, z, cmap='rainbow', rstride=1, cstride=1),繪制3維曲線ax.scatter(),參數類似前者。

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(x, y, z, cmap='rainbow', rstride=1, cstride=1)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")

  4.基本上很多的繪圖思路都如上,比如繪制一些分類器的分類區域圖。

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

fig = plt.figure()
ax = Axes3D(fig)

t = np.linspace(1, 5, 30)
x, y = np.meshgrid(t,t)
print(x)
print(y)
xy = np.stack([x.flat, y.flat], axis=1)
print(xy)
z = xy[:, 0] * xy[:, 1]
z = np.array(z)
z = z.reshape(x.shape)
print(z)
ax.plot_surface(x, y, z, cmap='rainbow', rstride=1, cstride=1)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
plt.show()

  5.繪制二元高斯分布3維圖

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib as mpl

if __name__ == '__main__':
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False

    d = np.random.randn(10000000, 2)
    N = 30
    density, edges = np.histogramdd(d, bins=[30, 30])
    print("樣本總數: ", np.sum(density))
    density = density/density.max()
    x = y = np.arange(N)
    t = np.meshgrid(x,y)
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.scatter(t[0], t[1], density, c='r', s=15*density, marker='o', depthshade=True)
    ax.plot_surface(t[0], t[1], density, cmap='rainbow', rstride=1, cstride=1, alpha=0.9, lw=1)
    ax.set_xlabel("x軸")
    ax.set_ylabel("y軸")
    ax.set_zlabel("z軸")
    plt.title("二元高斯分布")
    plt.tight_layout(0.1)
    plt.show()

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM