返回文章列表

Python實作三維樣條曲線繪製

本文深入探討如何使用 Python 和 Matplotlib 繪製三維樣條曲線,包含三維座標旋轉、樣條插值、資料點繪製和垂直線新增等關鍵技術,並提供詳細的程式碼解析和流程圖解說,幫助讀者理解三維資料視覺化的實作過程和核心概念。

資料視覺化 Python

本文介紹如何使用 Python 和 Matplotlib 繪製三維樣條曲線。首先,我們需要定義三維座標系的原點和旋轉函式,以便在二維平面上呈現三維資料。接著,利用樣條插值計算曲線的控制點和係數,並透過迴圈計算曲線上的每個點的座標。在繪製過程中,我們需要對每個點進行旋轉變換,最後將這些點連線起來形成平滑的三維樣條曲線。同時,我們還將示範如何繪製原始資料點以及從資料點到 XY 平面的垂直線,以增強圖形的資訊量和可讀性。程式碼中使用 Matplotlib 函式庫實作圖形的繪製和顯示,並提供詳細的程式碼註解和圖表說明,方便讀者理解和應用。

三維資料繪圖技術

在前一章的基礎上,我們進一步探討如何將二維樣條曲線的繪圖技術擴充套件到三維空間。這個過程主要涉及在原有的程式碼中新增幾行關鍵程式碼,以實作對三維資料的有效繪製。

三維樣條曲線繪圖原理

三維樣條曲線的繪製主要依賴於對x、y、z三個座標軸的操作。與二維樣條曲線相比,三維樣條曲線的繪製需要在程式碼中引入z座標,並對相關的旋轉變換函式進行修改。

程式碼實作

import matplotlib.pyplot as plt
import numpy as np
from math import sqrt, radians, sin, cos

# 設定繪圖區域
plt.axis([0, 150, 0, 100])
plt.axis('on')
plt.grid(True)

# 定義旋轉變換函式
def rotx(xp, yp, zp, Rx):
    g = [0, 0, 0]
    g[0] = xp + xc
    g[1] = yp * cos(Rx) - zp * sin(Rx) + yc
    g[2] = yp * sin(Rx) + zp * cos(Rx) + zc
    return g

def roty(xp, yp, zp, Ry):
    g = [0, 0, 0]
    g[0] = xp * cos(Ry) + zp * sin(Ry) + xc
    g[1] = yp + yc
    g[2] = -xp * sin(Ry) + zp * cos(Ry) + zc
    return g

def rotz(xp, yp, zp, Rz):
    g = [0, 0, 0]
    g[0] = xp * cos(Rz) - yp * sin(Rz) + xc
    g[1] = xp * sin(Rz) + yp * cos(Rz) + yc
    g[2] = zp + zc
    return g

# 定義繪製座標軸的函式
def plotaxis(xp, yp, zp, Rx, Ry, Rz):
    g = rotx(xp, yp, zp, Rx)
    xp = g[0] - xc
    yp = g[1] - yc
    zp = g[2] - zc
    g = roty(xp, yp, zp, Ry)
    xp = g[0] - xc
    yp = g[1] - yc
    zp = g[2] - zc
    g = rotz(xp, yp, zp, Rz)
    return g

# 定義繪製資料點的函式
def plotdata(x, y, z, Rx, Ry, Rz):
    for i in range(nop):
        xp = x[i]
        yp = y[i]
        zp = z[i]
        g = rotx(xp, yp, zp, Rx)
        xp = g[0] - xc
        yp = g[1] - yc
        zp = g[2] - zc
        g = roty(xp, yp, zp, Ry)
        xp = g[0] - xc
        yp = g[1] - yc
        zp = g[2] - zc
        g = rotz(xp, yp, zp, Rz)
        plt.scatter(g[0], g[1], color='green')
        
#### 程式碼解析:
此程式碼實作了三維資料點的繪製及旋轉變換首先定義了三個旋轉變換函式`rotx`、`roty`、`rotz`,分別對應xyz軸的旋轉接著定義了`plotaxis`函式用於繪製座標軸以及`plotdata`函式用於繪製資料點`plotdata`函式中對每個資料點進行旋轉變換後使用`plt.scatter`函式繪製在圖形上程式碼中採用了局部的座標變換使得旋轉操作更加靈活方便

### 三維樣條曲線繪圖實作

#### 圖表解析:
此流程圖展示了三維樣條曲線繪圖的主要步驟首先定義資料點接著設定旋轉角度然後進行旋轉變換並繪製資料點和樣條曲線最後顯示最終的三維圖形透過這個流程可以清晰地理解三維樣條曲線的繪製過程

### 旋轉變換的實作

在三維空間中旋轉變換是至關重要的程式碼中使用了三個旋轉函式:`rotx`、`roty`、`rotz`,分別對應於繞xyz軸的旋轉每個函式都接受四個引數待變換的座標(xp, yp, zp)以及旋轉角度(Rx, Ry, Rz)透過這些函式可以實作對三維資料點的靈活旋轉

### 資料點的繪製

`plotdata`函式中對每個資料點進行旋轉變換後使用`plt.scatter`函式將其繪製在圖形上同時透過設定不同的顏色可以區分不同的資料點

### 樣條曲線的繪製

樣條曲線的繪製是根據資料點進行的在程式碼中首先對資料點進行旋轉變換然後使用樣條插值方法繪製出平滑的曲線這個過程與二維樣條曲線的繪製類別似但需要考慮z座標的影響

### 圖形的顯示

最終透過`matplotlib`函式庫將三維圖形顯示出來圖形中包含了旋轉後的資料點和樣條曲線以及座標軸透過旋轉和縮放可以從不同的角度觀察圖形從而更好地理解資料的分佈和變化趨勢

## 3D曲線繪製與樣條插值技術詳解

在現代資料視覺化領域中3D曲線的繪製和樣條插值技術扮演著至關重要的角色本文將深入探討如何利用Python實作3D樣條曲線的繪製並對相關程式碼進行詳細解析

### 3D座標旋轉技術基礎

在進行3D曲線繪製之前我們需要了解3D座標的旋轉技術這涉及到三個主要的旋轉函式:`rotx`、`roty``rotz`,分別對應於繞X軸Y軸和Z軸的旋轉操作

```python
def rotx(x, y, z, angle):
    """繞X軸旋轉"""
    y_rotated = y * np.cos(angle) - z * np.sin(angle)
    z_rotated = y * np.sin(angle) + z * np.cos(angle)
    return [x, y_rotated, z_rotated]

def roty(x, y, z, angle):
    """繞Y軸旋轉"""
    x_rotated = x * np.cos(angle) + z * np.sin(angle)
    z_rotated = -x * np.sin(angle) + z * np.cos(angle)
    return [x_rotated, y, z_rotated]

def rotz(x, y, z, angle):
    """繞Z軸旋轉"""
    x_rotated = x * np.cos(angle) - y * np.sin(angle)
    y_rotated = x * np.sin(angle) + y * np.cos(angle)
    return [x_rotated, y_rotated, z]

內容解密:

這三個函式實作了3D座標在不同軸上的旋轉變換。以rotx函式為例,它透過將原來的y和z座標進行線性組合,實作了繞X軸的旋轉。其中,旋轉角度的正弦和餘弦值用於計算新的y和z座標。

3D樣條曲線繪製實作

樣條曲線的繪製是透過plotspline函式實作的,該函式接收原始座標、旋轉角度和顏色引數。

def plotspline(x, y, z, Rx, Ry, Rz, clr):
    """繪製3D樣條曲線"""
    q = [0] * len(x)
    for i in range(1, len(x)):
        q[i-1] = np.sqrt((x[i]-x[i-1])**2 + (y[i]-y[i-1])**2 + (z[i]-z[i-1])**2)
    
    # 計算樣條係數
    mx = [0] * len(x)
    my = [0] * len(x)
    mz = [0] * len(x)
    # ... 其他係數計算
    
    for i in range(len(x)-1):
        for qq in np.arange(0, q[i], 2):
            xp = ax[i]*qq**3 + bx[i]*qq**2 + cx[i]*qq + dx[i]
            yp = ay[i]*qq**3 + by[i]*qq**2 + cy[i]*qq + dy[i]
            zp = az[i]*qq**3 + bz[i]*qq**2 + cz[i]*qq + dz[i]
            
            # 進行旋轉變換
            g = rotx(xp, yp, zp, Rx)
            g = roty(g[0], g[1], g[2], Ry)
            g = rotz(g[0], g[1], g[2], Rz)
            
            if qq == 0:
                xplast = g[0]
                yplast = g[1]
            plt.plot([xplast, g[0]], [yplast, g[1]], linewidth=0.7, color=clr)
            xplast = g[0]
            yplast = g[1]

圖表翻譯:

此圖示展示了3D樣條曲線的生成過程。首先計算各資料點之間的距離,接著計算樣條曲線的各項係數。然後透過三次插值計算出曲線上的各點座標,並進行相應的旋轉變換,最後將這些點連線成平滑的曲線。

3D資料點繪製與垂直線新增

除了樣條曲線的繪製,程式還實作了原始資料點的繪製以及從資料點到XY平面垂直線的繪製。

def plotdata(x, y, z, Rx, Ry, Rz):
    """繪製3D資料點"""
    for i, (xi, yi, zi) in enumerate(zip(x, y, z)):
        g = rotx(xi, yi, zi, Rx)
        g = roty(g[0], g[1], g[2], Ry)
        g = rotz(g[0], g[1], g[2], Rz)
        
        color = 'r' if i == 0 else 'g'
        plt.scatter(g[0], g[1], s=25, color=color)
        
        # 繪製垂直線
        xp, yp, zp = xi, yi, 0
        g_bottom = rotx(xp, yp, zp, Rx)
        g_bottom = roty(g_bottom[0], g_bottom[1], g_bottom[2], Ry)
        g_bottom = rotz(g_bottom[0], g_bottom[1], g_bottom[2], Rz)
        
        plt.plot([g[0], g_bottom[0]], [g[1], g_bottom[1]], color='grey')

圖表翻譯:

此圖示展示了3D資料點的繪製過程以及從資料點到XY平面的垂直線繪製。程式首先對原始座標進行旋轉變換,然後根據點的順序選擇不同的顏色進行繪製。垂直線的繪製則是透過計算資料點在XY平面上的投影點,然後連線原始點和投影點來實作的。

Plantuml圖表範例

圖表翻譯:

此流程圖展示了資料處理的基本流程。首先檢查資料的有效性,如果資料有效則進行處理,否則回報錯誤。無論資料處理成功與否,最終都會到達完成處理的階段。

三維資料視覺化技術詳解

在現代資料分析和科學視覺化領域中,三維資料的呈現是一個重要的研究方向。本文將深入探討如何使用Python和matplotlib函式庫實作三維曲線的繪製和旋轉變換,同時詳細解析相關的數學原理和程式實作。

三維座標系統的建立

首先,我們需要建立一個三維座標系統來描述空間中的點。這個系統由三個互相垂直的軸組成:X軸、Y軸和Z軸。在我們的實作中,座標原點被設定在畫布上的特定位置(xc, yc, zc)。

xc = 80  # 座標系統原點的x座標
yc = 20  # 座標系統原點的y座標
zc = 10  # 座標系統原點的z座標

內容解密:

這段程式碼定義了三維座標系統在畫布上的原點位置。其中xc、yc和zc分別代表了原點在畫布座標系統中的x、y和z座標值。正確設定這些引數對於後續的三維圖形顯示至關重要。

旋轉變換的實作

為了實作三維圖形的旋轉顯示,我們需要進行相應的座標變換。以下是實作的三個主要旋轉函式:

def rotx(xp, yp, zp, Rx):
    g = [0]*3
    g[0] = xp + xc
    g[1] = yp * cos(Rx) - zp * sin(Rx) + yc
    g[2] = yp * sin(Rx) + zp * cos(Rx) + zc
    return g

def roty(xp, yp, zp, Ry):
    g = [0]*3
    g[0] = xp * cos(Ry) + zp * sin(Ry) + xc
    g[1] = yp + yc
    g[2] = -xp * sin(Ry) + zp * cos(Ry) + zc
    return g

def rotz(xp, yp, zp, Rz):
    g = [0]*3
    g[0] = xp * cos(Rz) - yp * sin(Rz) + xc
    g[1] = xp * sin(Rz) + yp * cos(Rz) + yc
    g[2] = zp + zc
    return g

內容解密:

這三個函式分別實作了繞X軸、Y軸和Z軸的旋轉變換。函式接收原始座標(xp, yp, zp)和旋轉角度(以弧度表示)作為輸入,傳回變換後的座標。這些函式是實作三維圖形旋轉顯示的核心。

三維曲線的繪製

在實作中,我們使用三次樣條插值的方法來繪製平滑的三維曲線。以下是相關的實作程式碼:

def plotspline(x, y, z, Rx, Ry, Rz, clr):
    # 計算樣條曲線控制點
    for i in range(1, nop):
        a = x[i] - x[i-1]
        b = y[i] - y[i-1]
        c = z[i] - z[i-1]
        q[i-1] = sqrt(a*a + b*b + c*c)
    
    # 計算樣條曲線係數
    for i in range(0, nop-1):
        dx[i] = x[i]
        dy[i] = y[i]
        dz[i] = z[i]
        # ... 其他係數計算
    
    # 繪製樣條曲線
    for i in range(0, nop-1):
        for qq in np.arange(0, q[i], 2):
            xp = ax[i]*qq*qq*qq + bx[i]*qq*qq + cx[i]*qq + dx[i]
            yp = ay[i]*qq*qq*qq + by[i]*qq*qq + cy[i]*qq + dy[i]
            zp = az[i]*qq*qq*qq + bz[i]*qq*qq + cz[i]*qq + dz[i]
            #  учтите повороты
            xp = g[0] - xc
            yp = g[1] - yc
            zp = g[2] - zc
            # ... 後續座標變換和繪製

內容解密:

這段程式碼實作了使用三次樣條插值繪製三維曲線的功能。首先計算曲線的控制點和係數,然後透過迴圈計算曲線上的點並進行座標變換,最後繪製出平滑的三維曲線。程式中詳細考慮了座標變換的過程,並且採用了適當的數學方法保證了曲線的平滑性。

Plantuml 圖表展示程式流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Python實作三維樣條曲線繪製

package "資料視覺化流程" {
    package "資料準備" {
        component [資料載入] as load
        component [資料清洗] as clean
        component [資料轉換] as transform
    }

    package "圖表類型" {
        component [折線圖 Line] as line
        component [長條圖 Bar] as bar
        component [散佈圖 Scatter] as scatter
        component [熱力圖 Heatmap] as heatmap
    }

    package "美化輸出" {
        component [樣式設定] as style
        component [標籤註解] as label
        component [匯出儲存] as export
    }
}

load --> clean --> transform
transform --> line
transform --> bar
transform --> scatter
transform --> heatmap
line --> style --> export
bar --> label --> export

note right of scatter
  探索變數關係
  發現異常值
end note

@enduml

圖表翻譯:

此圖示展示了一個基本的資料處理流程。流程始於「開始」階段,接著進行資料有效性檢查。若資料有效,系統會進入「處理資料」階段;若資料無效,則轉向「回報錯誤」階段。最後,無論資料處理成功與否,流程都會到達「完成處理」階段。此圖清晰地說明瞭程式中的條件分支邏輯以及不同處理路徑的銜接方式。

  1. 最佳化三維曲線的繪製演算法,提高渲染效率
  2. 實作更複雜的三維圖形變換,如縮放和映象
  3. 結合互動式技術,實作三維圖形的動態展示和互動操作

透過這些改進,可以進一步提升三維資料視覺化的效果和應用範圍。