Skip to main content

3D Plotting

ทำความรู้จักกับ 3D Plotting

3D Plotting คือการสร้างกราฟหรือการแสดงข้อมูลในรูปแบบสามมิติ โดยทั่วไปแล้วการแสดงข้อมูลมักจะมีแกนสองแกนคือแกน X (แนวนอน) และแกน Y (แนวตั้ง) ในการทำ 2D Plotting แต่สำหรับ 3D Plotting จะมีการเพิ่มแกนที่สามเข้ามา คือแกน Z ซึ่งเป็นแกนที่ให้มิติเพิ่มเติมในเชิงลึก ทำให้กราฟที่แสดงผลออกมาสามารถมองเห็นความสัมพันธ์ของข้อมูลในสามมิติ

การทำ 3D Plotting มีประโยชน์ในการแสดงข้อมูลที่มีความซับซ้อนหรือต้องการแสดงความสัมพันธ์ของข้อมูลในมิติที่มากกว่า 2 มิติ เช่น:

  • การแสดงผลการกระจายตัวของข้อมูลในรูปแบบสามมิติ
  • การแสดงผลพื้นผิว (Surface Plots) ที่มีตัวแปรในสามมิติ
  • การแสดงผลฟังก์ชันทางคณิตศาสตร์ในรูปแบบสามมิติ

ตัวอย่างการใช้งาน 3D Plotting ใน Python

สามารถใช้ไลบรารี matplotlib เพื่อสร้างกราฟแบบ 3 มิติได้ โดยสามารถใช้โมดูล mpl_toolkits.mplot3d ของ matplotlib ในการสร้างกราฟ 3D

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

# สร้างข้อมูลสำหรับแกน X, Y, Z
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))

# สร้างกราฟ 3D
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# plot surface
ax.plot_surface(x, y, z, cmap='viridis')

# เพิ่มหัวข้อและแกน
ax.set_title('3D Surface Plot of sin(sqrt(x^2 + y^2))')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')

# แสดงกราฟ
plt.show()

ผลลัพธ์

matplotlib11.webp

3D Plot ประเภทอื่นๆ

3D Scatter Plots, Wireframes, และ Surface Plots เป็นวิธีการแสดงผลข้อมูลแบบสามมิติ (3D) ที่ใช้ในการทำกราฟหรือการแสดงผลข้อมูลในเชิงลึกและซับซ้อนมากขึ้น แต่ละรูปแบบมีจุดประสงค์และลักษณะเฉพาะตัวที่ช่วยในการนำเสนอข้อมูลในมุมมองที่แตกต่างกัน

3D Scatter Plot

3D Scatter Plot คือการแสดงจุดข้อมูล (data points) ในพื้นที่สามมิติ โดยจุดแต่ละจุดจะถูกแสดงในตำแหน่งที่สัมพันธ์กันตามค่าของแกน X, Y และ Z ช่วยให้เห็นการกระจายตัวของข้อมูลในสามมิติ

code python

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

# สร้างข้อมูลแบบสุ่มสำหรับแกน X, Y, Z
x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)

# สร้างกราฟ 3D Scatter Plot
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')

# plot จุดข้อมูล
ax.scatter(x, y, z, c='r', marker='o')

# เพิ่มหัวข้อและแกน
ax.set_title('3D Scatter Plot')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')

# แสดงผล
plt.show()

ผลลัพธ์

matplotlib-12.webp

Wireframe Plot

Wireframe Plot คือการแสดงโครงสร้างพื้นผิวสามมิติในลักษณะของเส้นลวด (wireframe) โดยไม่มีการเติมสีพื้นผิว การแสดงในรูปแบบนี้มักจะใช้ในการสร้างโครงสร้างพื้นฐานของกราฟที่มีความซับซ้อน ช่วยให้เห็นรูปแบบโดยรวมของข้อมูลได้ง่าย

code python

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

# สร้างข้อมูลสำหรับแกน X, Y, Z
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
x, y = np.meshgrid(x, y)
z = np.sin(np.sqrt(x**2 + y**2))

# สร้างกราฟ Wireframe
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')

# plot wireframe
ax.plot_wireframe(x, y, z, color='blue')

# เพิ่มหัวข้อและแกน
ax.set_title('3D Wireframe Plot')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')

# แสดงผล
plt.show()

ผลลัพธ์

matplotlib-13.webp

Surface Plot

Surface Plot คือการแสดงผลข้อมูลในลักษณะของพื้นผิว (surface) ที่เต็มไปด้วยสีและพื้นผิวตามค่าของแกน Z การแสดงผลในรูปแบบนี้ช่วยให้สามารถมองเห็นความแตกต่างของค่าบนพื้นผิวในแต่ละจุดได้อย่างชัดเจน

code python

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

# สร้างข้อมูลสำหรับแกน X, Y, Z
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
x, y = np.meshgrid(x, y)
z = np.sin(np.sqrt(x**2 + y**2))

# สร้างกราฟ Surface Plot
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')

# plot surface
surface = ax.plot_surface(x, y, z, cmap='viridis')

# เพิ่มหัวข้อและแกน
ax.set_title('3D Surface Plot')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')

# เพิ่ม color bar เพื่อบอกค่า Z
fig.colorbar(surface)

# แสดงผล
plt.show()

ผลลัพธ์

matplotlib-14.webp

ตัวอย่างอื่นๆ

การสร้าง 3D plots โดยใช้ข้อมูลจากไฟล์ CSV สามารถทำได้โดยการโหลดข้อมูลเข้าสู่ Python ผ่านไลบรารีอย่างเช่น pandas และใช้ไลบรารี matplotlib ในการสร้าง 3D plot ตัวอย่างต่อไปนี้จะแสดงการสร้าง 3D scatter plot, wireframe plot และ surface plot โดยใช้ข้อมูลจากไฟล์ CSV

ตัวอย่าง sales_data.csv

Time,Price,Sales Volume
1,200,50
2,250,65
3,300,70
4,320,80
5,400,95
6,450,100
7,500,110
8,550,120
9,600,130
10,620,150

ตัวอย่าง code python

import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# อ่านข้อมูลจากไฟล์ CSV
df = pd.read_csv('sales_data.csv')

# สร้างกราฟ 3D Scatter Plot
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# กำหนดข้อมูลสำหรับแกน X, Y, Z
x = df['Time'] # แกน X เป็น Time
y = df['Price'] # แกน Y เป็น Price
z = df['Sales Volume'] # แกน Z เป็น Sales Volume

# plot ข้อมูลในรูปแบบ 3D scatter plot
scatter = ax.scatter(x, y, z, c=z, cmap='viridis', marker='o')

# เพิ่มหัวข้อและแกน
ax.set_title('3D Sales Data Scatter Plot')
ax.set_xlabel('Time')
ax.set_ylabel('Price')
ax.set_zlabel('Sales Volume')

# เพิ่ม color bar เพื่อแสดงค่าของ Sales Volume
fig.colorbar(scatter, ax=ax, label='Sales Volume')

# แสดงผล
plt.show()

ผลลัพธ์

matplotlib-15.webp

การใช้ Generative AI ช่วย Plot

หากเรามี data และเรายังไม่รู้ว่าจะ render ออกมาเป็นยังไง สามารถใช้ Generative AI อย่าง ChatGPT, Claude, Gemini ในการช่วยให้คำแนะนำ render ได้

เช่น จากตัวอย่างนี้คือ ChatGPT โดยเราสามารถ upload ข้อมูล csv เข้าไป เพื่อให้ python ทำการ plot ตาม csv ที่ upload เข้าไปได้

example-gpt.webp

รวมถึงสามารถกดดู python code เพื่อเอามาพัฒนาต่อได้เช่นกัน

example-gpt-2.webp

จริงๆ ในเจ้าอื่นๆเอง (Claude, Gemini) ก็สามารถทำได้เช่นกัน แต่สำหรับ 2 ตัวนี้ถ้าเป็นตัวฟรี จะออกมาเพียงแค่ Code แต่ก็สามารถนำ python code มาทดสอบ run บน local ของเราได้เช่นกันนะครับ (เป็นเหมือนตัวช่วยให้คำแนะนำได้)

คำแนะนำสำหรับการใช้งานร่วมกับ Generative AI

  • พยายามรู้สึกและทำความเข้าใจ Graph แต่ละประเภท
  • ให้ Generative AI plot Graph ประเภทนั้นๆ โดยอ้างอิงตามข้อมูลที่มี

จะประหยัดเวลาในการทำ vistualization ได้มากเช่นกัน