返回文章列表

Python資料視覺化與圖學基礎詳解

本文深入探討 Python 資料視覺化與三維圖學基礎,涵蓋 Matplotlib 繪圖指令、座標變換、透視投影、隱線消除等核心技術,並以氣候變化模擬為例展示實際應用。文章從二維圖形繪製到三維場景建構,逐步講解關鍵技術,並提供程式碼範例與圖表解析,適合資料科學與圖學領域的學習者。

資料視覺化 電腦圖學

Python 的 Matplotlib 函式庫提供豐富的繪圖功能,是資料視覺化的利器。從建立繪圖區域、自定義網格和座標軸,到繪製散點圖、線圖以及新增箭頭和文字標註,Matplotlib 提供了便捷的工具。更進一步,我們可以利用點繪製圓弧、使用 Axes3D 模組繪製三維曲面,並透過色彩對映增強視覺效果。在三維圖學領域,座標變換、矩陣串接、透視投影和隱線消除等技術是構建三維場景的根本,Python 同樣能勝任這些任務。結合功能式程式設計的鍵盤輸入處理,更能開發互動式圖形應用。最後,文章以氣候變化模擬和太陽輻射模型為例,展示了 Python 在科學計算領域的應用價值,從二維到三維,涵蓋了資料視覺化與圖學的基礎知識。

資料視覺化基礎:Python繪圖指令與函式詳解

在資料科學和科學計算領域,視覺化是理解和呈現資料的重要手段。Python提供了強大的繪圖工具,特別是透過matplotlib函式庫,能夠實作多樣化的視覺化效果。本篇文章將深入探討Python中繪圖的基本指令和函式,並介紹如何有效地使用這些工具來建立高品質的圖表。

繪圖區域的建立與設定

建立一個合適的繪圖區域是視覺化的第一步。透過調整繪圖區域的大小和解析度,可以確保圖表清晰可讀。

import matplotlib.pyplot as plt

# 建立一個新的圖表
plt.figure(figsize=(8, 6), dpi=100)

# 繪製簡單的線圖
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])

# 顯示圖表
plt.show()

程式碼解析:

此程式碼片段展示瞭如何使用matplotlib建立一個簡單的線圖。首先匯入matplotlib.pyplot模組,然後使用plt.figure()函式建立一個新的圖表,並設定其大小和解析度。接著使用plt.plot()函式繪製一個簡單的線圖,最後透過plt.show()顯示圖表。

自定義網格與座標軸

網格和座標軸的自定義是提升圖表可讀性的關鍵。可以透過調整網格顏色、刻度標記和標籤來增強視覺效果。

import matplotlib.pyplot as plt

# 建立圖表
plt.figure(figsize=(8, 6))

# 繪製資料
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])

# 自定義網格
plt.grid(color='gray', linestyle='--', linewidth=0.5)

# 設定座標軸標籤
plt.xlabel('X軸')
plt.ylabel('Y軸')

# 顯示圖表
plt.show()

程式碼解析:

這段程式碼展示瞭如何自定義網格和座標軸標籤。首先使用plt.grid()函式設定網格的顏色、樣式和寬度。然後透過plt.xlabel()plt.ylabel()函式設定X軸和Y軸的標籤。這些自定義選項能夠讓圖表更具可讀性和專業性。

常見的繪圖指令與函式

Python提供了多種繪圖指令和函式,可以滿足不同的視覺化需求。以下是一些常見的繪圖函式:

  1. 散點圖(Scatter Plot)
    使用plt.scatter()函式可以繪製散點圖,適合展示資料點的分佈。

    plt.scatter([1, 2, 3, 4], [1, 4, 9, 16])
    
  2. 線圖(Line Plot)
    使用plt.plot()函式繪製線圖,適合展示資料的趨勢。

    plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
    
  3. 箭頭標記(Arrows)
    使用plt.arrow()函式可以在圖表中新增箭頭標記,用於突出顯示重要資訊。

    plt.arrow(2, 4, 1, 2, head_width=0.2, head_length=0.2, fc='r', ec='b')
    
  4. 文字標註(Text Annotation)
    使用plt.text()函式可以在圖表中新增文字標註,用於解釋資料或突出重點。

    plt.text(2, 10, '關鍵資料點', fontsize=12, color='red')
    

二維圖形的繪製

二維圖形是資料視覺化的重要組成部分。透過繪製線條、圓形和橢圓等基本圖形,可以實作複雜的視覺化效果。

使用點繪製圓弧

import numpy as np
import matplotlib.pyplot as plt

theta = np.linspace(0, 2*np.pi, 100)
x = np.cos(theta)
y = np.sin(theta)

plt.plot(x, y)
plt.gca().set_aspect('equal')
plt.show()

程式碼解析:

此範例展示瞭如何使用點繪製圓形。透過np.linspace()函式生成一系列角度值,然後計算對應的x和y座標,最後使用plt.plot()繪製圓形。plt.gca().set_aspect('equal')確保圓形不會因座標軸比例不同而變形。

三維圖形的繪製

三維圖形能夠更直觀地展示複雜的資料關係。Python支援透過matplotlib的Axes3D模組進行三維繪圖。

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = np.linspace(-1, 1, 100)
y = np.linspace(-1, 1, 100)
X, Y = np.meshgrid(x, y)
Z = X**2 + Y**2

ax.plot_surface(X, Y, Z, cmap='viridis')

plt.show()

程式碼解析:

這段程式碼展示瞭如何繪製三維曲面圖。首先建立一個三維座標軸,然後使用np.meshgrid()生成網格資料,接著計算Z軸的值。最後使用ax.plot_surface()函式繪製三維曲面,並透過色彩對映(colormap)增強視覺效果。

資料視覺化的最佳實踐

  1. 合適的色彩選擇
    選擇合適的顏色和色彩強度對於視覺化至關重要。避免使用過於鮮豔或對比過強的顏色組合。

  2. 適當的標註
    為圖表新增適當的標題、座標軸標籤和圖例,可以幫助讀者理解圖表內容。

  3. 避免過度繪製
    避免在同一張圖表中繪製過多的資料系列,以免造成視覺混亂。

  4. 保持圖表簡潔
    簡潔的圖表更容易傳達資訊。避免不必要的裝飾和複雜的設計。

圖表解析:

此流程圖展示了使用Python進行資料視覺化的一般步驟。從建立圖表開始,逐步進行自定義設定、選擇適當的繪圖函式、繪製圖形、新增標註、調整視覺效果,直到最終輸出與分享圖表。這個流程幫助使用者系統性地完成資料視覺化任務。

三維電腦圖學基礎:從座標變換到氣候變化模擬

座標系統與變換

在電腦圖學中,三維座標系統是所有圖形運算的基礎。座標變換則是實作物體旋轉、縮放和平移的關鍵技術。

單獨座標軸旋轉

座標軸旋轉是三維變換中的基本操作。以下是一個繞Z軸旋轉的範例程式碼:

import numpy as np

def rotate_z_axis(angle):
    radian = np.deg2rad(angle)
    return np.array([
        [np.cos(radian), -np.sin(radian), 0],
        [np.sin(radian), np.cos(radian), 0],
        [0, 0, 1]
    ])

# 使用範例
rotation_matrix = rotate_z_axis(45)
print(rotation_matrix)

內容解密:

此程式碼定義了一個函式rotate_z_axis,用於生成繞Z軸旋轉的變換矩陣。函式首先將角度轉換為弧度,然後構建旋轉矩陣。矩陣的構建遵循三維旋轉變換的數學原理,能夠正確實作空間中的旋轉操作。

順序座標軸旋轉

當需要進行多次旋轉時,旋轉順序變得非常重要。以下Plantuml圖表展示了不同旋轉順序的影響:

圖表翻譯:

此圖示展示了在三維空間中,不同旋轉順序對最終結果的影響。左側路徑表示先繞X軸旋轉再繞Y軸旋轉,右側路徑表示先繞Y軸旋轉再繞X軸旋轉。兩種不同的旋轉順序會導致不同的最終狀態,說明瞭旋轉操作的不交換性。

矩陣串接

矩陣串接是實作複雜三維變換的核心技術。以下是一個矩陣串接的範例:

def concatenate_transforms(rotation, scale):
    return np.dot(rotation, scale)

# 定義旋轉和縮放矩陣
rotation = np.array([
    [0.707, -0.707, 0],
    [0.707, 0.707, 0],
    [0, 0, 1]
])

scale = np.array([
    [2, 0, 0],
    [0, 1, 0],
    [0, 0, 1]
])

# 串接變換
transform = concatenate_transforms(rotation, scale)
print(transform)

內容解密:

此程式碼展示瞭如何將旋轉和縮放變換串接起來。函式concatenate_transforms接收旋轉矩陣和縮放矩陣作為輸入,並使用矩陣乘法將它們結合。最終得到的變換矩陣能夠同時實作旋轉和縮放效果。

互動式資料輸入

在實作互動式圖形應用時,鍵盤輸入處理是關鍵功能之一。以下是一個使用功能式程式設計結構處理鍵盤輸入的範例:

def process_keyboard_input(key):
    actions = {
        'w': move_forward,
        's': move_backward,
        'a': rotate_left,
        'd': rotate_right
    }
    action = actions.get(key.lower())
    if action:
        action()

def move_forward():
    print("向前移動")

def move_backward():
    print("向後移動")

def rotate_left():
    print("向左旋轉")

def rotate_right():
    print("向右旋轉")

# 測試輸入處理
process_keyboard_input('w')
process_keyboard_input('d')

內容解密:

此程式碼實作了一個根據功能式程式設計的鍵盤輸入處理系統。process_keyboard_input函式根據不同的鍵盤輸入執行對應的操作。透過使用字典對映鍵盤輸入到具體的操作函式,實作了程式碼的模組化和可擴充套件性。

透視投影

透視投影是實作真實感三維渲染的重要技術。以下是一個簡單的透視投影範例:

def perspective_projection(point, distance):
    x, y, z = point
    factor = distance / (distance - z)
    return (x * factor, y * factor)

# 測試透視投影
point = (1, 2, 3)
projected = perspective_projection(point, 5)
print(projected)

內容解密:

此程式碼實作了一個簡單的透視投影函式。函式接收三維點座標和觀察者距離作為輸入,根據透視投影原理計算投影後的二維座標。透視投影能夠模擬人類視覺的遠近效果,使三維場景更具真實感。

隱線消除

隱線消除是三維圖形渲染中的重要技術,用於移除被遮擋的線條。以下是一個簡單的隱線消除範例:

def is_line_visible(line, objects):
    for obj in objects:
        if is_line_behind_object(line, obj):
            return False
    return True

def is_line_behind_object(line, object):
    # 簡化的遮擋判斷邏輯
    return False

# 測試隱線消除
line = ((0,0,0), (1,1,1))
objects = [...]  # 場景中的物體列表
if is_line_visible(line, objects):
    print("線段可見")
else:
    print("線段被遮擋")

內容解密:

此程式碼展示了隱線消除的基本思路。is_line_visible函式透過檢查線段是否被場景中的物體遮擋來判斷其可見性。實際的遮擋判斷邏輯需要根據具體的場景和物體形狀來實作。

三維資料繪製

三維資料繪製是科學視覺化中的重要應用。以下是一個簡單的三維表面繪製範例:

import matplotlib.pyplot as plt
import numpy as np

def plot_3d_surface():
    x = np.linspace(-5, 5, 100)
    y = np.linspace(-5, 5, 100)
    X, Y = np.meshgrid(x, y)
    Z = np.sin(np.sqrt(X**2 + Y**2))
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.plot_surface(X, Y, Z, cmap='viridis')
    plt.show()

# 繪製三維表面
plot_3d_surface()

內容解密:

此程式碼使用matplotlib函式庫繪製了一個三維表面。函式plot_3d_surface首先生成網格資料,然後計算對應的Z值,最後使用plot_surface函式繪製出三維表面圖。

氣候變化模擬

氣候變化模擬是科學計算中的重要應用。以下是一個簡化的氣候模型範例:

def climate_model(initial_temp, years):
    temp = initial_temp
    temps = [temp]
    for year in range(years):
        # 簡化的氣候模型
        temp += np.random.normal(0, 0.1)
        temps.append(temp)
    return temps

# 執行氣候模型
temperatures = climate_model(15, 100)
plt.plot(temperatures)
plt.show()

內容解密:

此程式碼實作了一個簡化的氣候變化模型。函式climate_model模擬了隨時間變化的氣溫資料。透過引入隨機擾動來模擬真實氣候系統的複雜性。

太陽輻射模擬

太陽輻射模擬是氣候研究中的重要內容。以下是一個簡單的太陽輻射模型:

def solar_radiation_model(distance):
    # 簡化的太陽輻射模型
    solar_constant = 1366  # W/m^2
    return solar_constant / (distance**2)

# 計算地球接收的太陽輻射
earth_distance = 1  # AU
radiation = solar_radiation_model(earth_distance)
print(f"地球接收的太陽輻射: {radiation} W/m^2")

內容解密:

此程式碼實作了一個簡單的太陽輻射模型。函式solar_radiation_model根據行星與太陽的距離計算接收到的太陽輻射強度。模型根據平方反比定律,反映了太陽輻射隨距離的衰減。

Python基礎指令與函式

在本章中,您將學習到製作本文插圖所需的Python基本指令和函式。您將瞭解如何使用Python的基本繪圖功能、設定繪圖區域、建立二維座標軸,並使用基本的繪圖元素(點、線和箭頭),這些是您在整本文中構建影像的基本構件。在第二章中,您將學習如何使用這些基本元素來構建二維影像,並對其進行平移和旋轉。在第三章中,您將把這些概念擴充套件到三維空間。同時,您還將學習到如何使用顏色、如何在圖表中新增文字(包括使用Latex指令),以及如何使用列表和陣列。透過這些學習,您將能夠建立如圖1-1a和1-1b中土星的影像。

import matplotlib.pyplot as plt
import numpy as np

# 設定繪圖區域
plt.figure(figsize=(8, 6))

# 建立資料
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 繪製圖形
plt.plot(x, y, label='sin(x)')

# 新增標題和標籤
plt.title('正弦函式圖')
plt.xlabel('x')
plt.ylabel('sin(x)')

# 顯示圖例
plt.legend()

# 顯示圖形
plt.show()

內容解密:

此程式碼展示瞭如何使用Python的matplotlib函式庫來繪製一個簡單的正弦函式圖。首先,我們匯入了必要的函式庫:matplotlib.pyplot用於繪圖,numpy用於數值運算。接著,我們設定了一個大小為8x6的繪圖區域。然後,我們使用np.linspace建立了一組從0到10的100個等間隔資料點,並計算了這些點對應的正弦值。隨後,我們使用plt.plot繪製了這條正弦曲線,並為其增加了標籤。最後,我們新增了圖表標題、x軸和y軸標籤,以及圖例,並顯示了圖形。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Python資料視覺化與圖學基礎詳解

package "圖論網路分析" {
    package "節點層" {
        component [節點 A] as nodeA
        component [節點 B] as nodeB
        component [節點 C] as nodeC
        component [節點 D] as nodeD
    }

    package "中心性指標" {
        component [度中心性
Degree Centrality] as degree
        component [特徵向量中心性
Eigenvector Centrality] as eigen
        component [介數中心性
Betweenness Centrality] as between
        component [接近中心性
Closeness Centrality] as close
    }
}

nodeA -- nodeB
nodeA -- nodeC
nodeB -- nodeD
nodeC -- nodeD

nodeA --> degree : 計算連接數
nodeA --> eigen : 計算影響力
nodeB --> between : 計算橋接度
nodeC --> close : 計算距離

note right of degree
  直接連接數量
  衡量局部影響力
end note

note right of eigen
  考慮鄰居重要性
  衡量全局影響力
end note

@enduml

圖表翻譯:

此圖示描述了使用Python繪製圖形的基本流程。首先,我們從匯入必要的函式庫開始。接著,設定一個適當大小的繪圖區域。然後,建立所需的資料。隨後,使用這些資料繪製圖形。接下來,為圖形新增標題和軸標籤,以提高可讀性。同時,新增圖例以說明圖形中不同元素的意義。最後,顯示完成的圖形。這一系列步驟構成了使用Python進行資料視覺化的基礎。