Basic Data Visualization with Matplotlib
pyplotNote
Live Code ในโมดูลนี้ใช้ matplotlib จริงใน browser (Pyodide) — กด Run เพื่อดูกราฟ
ไลบรารีสำหรับการสร้างภาพจากข้อมูลด้วย Python
matplotlib มี module ย่อย ๆ หลายตัวModule หลักที่เราจะใช้ คือ pyplotกราฟเส้น — plot จุดข้อมูลตามลำดับแล้วลากเส้นเชื่อม
กราฟเส้น (line plot) เกิดจากการ plot จุดข้อมูลตามลำดับ แล้วลากเส้นเชื่อม
.plot() สร้างกราฟเส้น โดยส่ง List ของตัวเลขเป็นพารามิเตอร์.show() ใช้แสดงภาพออกมาถ้าส่ง List ให้ .plot() เพียงรายการเดียว
0 เพิ่มทีละ 1Note
ทบทวน: List (Module 8)
ให้พล็อตกราฟของข้อมูล data = [6, 0, 2, 1, -5, 4, 3, 8]
การพิมพ์ matplotlib.pyplot. ทุกครั้งไม่สะดวก เราลดรูปด้วยการตั้ง ชื่อเล่น (alias) ให้โมดูล
สำหรับ pyplot เรามักตั้งชื่อเล่นว่า plt
พล็อตกราฟของ data = [6, 0, 2, 1, -5, 4, 3, 8] โดยตั้ง alias name ให้ matplotlib.pyplot ว่า plt
ถ้าเรียกใช้ฟังก์ชันบางตัวบ่อยมาก สามารถ import เฉพาะฟังก์ชันเข้ามาแล้วเรียกใช้โดยตรง (ไม่ต้องระบุชื่อโมดูล)
Warning
วิธีนี้ไม่ค่อยนิยม เพราะถ้าตั้งชื่อฟังก์ชันของเราซ้ำกัน อาจเกิดความสับสนเวลาเรียกใช้
พล็อตกราฟของ data เดิม โดย import ฟังก์ชัน plot กับ show เข้ามาใช้เลย (ไม่ต้องเรียกชื่อโมดูลซ้ำ)
ถ้าส่ง List ให้ .plot() 2 รายการ จะนำมาสร้างเป็นคู่ลำดับของข้อมูล
ข้อมูลจะถูก plot ตามลำดับคู่อันดับ จาก item แรกถึง item สุดท้าย พร้อมลากเส้นเชื่อมแต่ละจุด
พล็อตกราฟของข้อมูลคู่ลำดับที่กำหนดให้
พล็อตกราฟของข้อมูลคู่ลำดับ 2 ชุด — รูปแรก (x1, y1), รูปที่สอง (x2, y2)
พล็อตกราฟการเคลื่อนที่ของวัตถุในช่วงวินาทีที่ 0 ถึง 9
ความสัมพันธ์ของระยะทาง \(s = ut + \dfrac{1}{2}at^2\) เมื่อ \(u=3\ m/s\) (ความเร็วต้น), \(a=10\ m/s^2\) (ความเร่ง), \(t\) = เวลา (s)
คิดก่อน: จะสร้าง distances จาก times ด้วย list comprehension อย่างไร?
Note
เพิ่มคำอธิบายพื้นฐานให้ chart ได้ด้วยฟังก์ชัน (ต้องเรียกก่อน .show())
.xlabel() — คำอธิบาย x-axis.ylabel() — คำอธิบาย y-axis.title() — ชื่อของ chartจากโจทย์ข้อ 6 ให้เพิ่มป้ายชื่อแกนและ title — แกน x: Time(s), แกน y: Distance(m), title: Vehicle Movement Chart
กำหนด option ให้ .plot() เพื่อปรับสี เส้น และจุดข้อมูล
กำหนดสีด้วย color option โดยระบุสัดส่วนแม่สีแสง (red, green, blue) แต่ละค่าเป็น float 0.0–1.0
x = [5,3,4,5,6,7,5,5.35,4.65,5]
y = [0,2,3,2.5,3,2,0,0.9,1.7,2.5]
plt.plot(x, y, color=(0.5,0,1), marker='*')
plt.show()
plt.plot(x, y, color=(1,0,0)) # red=1.0
plt.plot(x, y, color=(0,1,0)) # green=1.0
plt.plot(x, y, color=(0,0,1)) # blue=1.0
plt.plot(x, y, color=(105/255, 66/255, 24/255))
plt.show()
เรียก .plot() หลายครั้งกับข้อมูลแต่ละชุด แล้วเรียก .show() ครั้งเดียวตอนท้าย
'xyz'กำหนด color, linestyle, marker พร้อมกันด้วยข้อความ 'xyz'
x = สี เช่น r(red), g(green), b(blue), m(magenta)y = เส้น เช่น (no line), -(line), :(dot)z = จุด เช่น s(square), ^(triangle), .(dot).legend()กำหนด label ให้แต่ละ plot แล้วเรียก .legend() เพื่อแสดงกล่องคำอธิบาย (Matplotlib จัดตำแหน่งให้อัตโนมัติ)
ขนาด chart ปกติคือ 6.4 x 4.8 นิ้ว เปลี่ยนได้ผ่าน .figure() โดยกำหนด figsize เป็น Tuple (width, height)

Note
ทบทวน: Tuple (Module 4)
เหมาะกับข้อมูลประเภท Categorical Data
ใช้ .bar() ส่ง labels (Categorical Data บนแกนนอน) ตามด้วย ค่า (ความสูงแท่งบนแกนตั้ง)
ใช้ .barh() สร้าง Bar plot แนวนอน — แกน y เรียง first-to-last อัตโนมัติ
กลับทิศ y-axis เป็น last-to-first ด้วย plt.gca().invert_yaxis()
กำหนดความกว้างแท่ง (bar width) ด้วยค่า float เป็นพารามิเตอร์ตัวที่ 3 ของ .bar()
Warning
หมายเหตุ: เนื้อหาการวาดกราฟแท่งหลายชุดใน chart เดียวกันนี้ ไม่ออกสอบ
ถ้าใช้ labels ชุดเดียวกัน แท่งข้อมูลจะทับกัน — แก้ด้วยการส่ง ตำแหน่ง (x) แทน labels
.xticks()เลื่อนตำแหน่งแท่งแต่ละชุดด้วย barwidth/2 แล้วกำหนด label ที่ถูกต้องด้วย .xticks()
x1 = [i-barwidth/2 for i in range(len(labels))]
x2 = [i+barwidth/2 for i in range(len(labels))]
# x1: [-0.2, 0.8, 1.8, 2.8, 3.8]
# x2: [ 0.2, 1.2, 2.2, 3.2, 4.2]
plt.bar(x1, values1, barwidth, label='values1')
plt.bar(x2, values2, barwidth, label='values2')
plt.xticks(range(len(labels)), labels)
plt.legend()
plt.show()
แสดงการกระจายตัวของข้อมูลในแต่ละช่วง (bin)
ใช้ .hist() — ฟังก์ชันจะกำหนดจำนวนช่วง (bin) ให้อัตโนมัติ หรือส่งค่า int เป็นพารามิเตอร์ที่ 2 เพื่อกำหนดเอง
กำหนด x-ticks ด้วย .xticks() และปรับสีด้วย facecolor (สีแท่ง) / edgecolor (สีขอบ)
แสดงสัดส่วนของข้อมูลด้วยกราฟวงกลม
ใช้ .pie() ส่งรายการข้อมูล — เพิ่มคำอธิบายแต่ละส่วนด้วย labels option
แสดงตัวเลขสัดส่วนด้วย autopct (ใส่ '%%' เพื่อแสดง %) และดึงข้อมูลออกด้วย explode (List ของค่าทศนิยม)
แสดงข้อมูล 2 มิติเป็นแผนที่ความร้อน (heatmap)
.imshow().imshow() แสดงข้อมูล 2 มิติเป็น heatmap — ใช้ความเข้มของสีแทนค่าข้อมูล

Note
ทบทวน: 2D list (Module 10)
กำหนด ticks ด้วย .xticks()/.yticks() · เลือก color mapping ด้วย cmap · แสดงช่วงค่าด้วย .colorbar()
วาดหลาย chart ในภาพเดียวกัน แต่ละอันมีแกนของตัวเอง
ใช้ .subplot(row, col, location) — นับตำแหน่งจากซ้ายไปขวา บนลงล่าง
import math
x = [i*0.1 for i in range(201)]
y1 = [math.sin(i) for i in x]
y2 = [math.sin(2*i) for i in x]
# ... y3 ... y6
plt.subplot(2,3,1); plt.plot(x, y1)
plt.subplot(2,3,2); plt.plot(x, y2)
plt.subplot(2,3,3); plt.plot(x, y3)
plt.subplot(2,3,4); plt.plot(x, y4)
plt.subplot(2,3,5); plt.plot(x, y5)
plt.subplot(2,3,6); plt.plot(x, y6)
plt.show()
Note
ทบทวน: math module (Module 3)
ใช้ loop + list comprehension สร้างข้อมูล 8 ชุด แล้ววาดใน subplot ขนาด 2 x 4

Note
สร้างรูปภาพ (หน้าต่าง) ใหม่สำหรับวาด chart
.figure() สร้างรูปภาพใหม่สำหรับวาด chart — แต่ละรูปมี subplot ของตัวเองได้
import matplotlib.pyplot as plt
import math
x = [i*0.1 for i in range(201)]
y1 = [math.sin(i) for i in x]
y2 = [math.sin(2*i) for i in x]
y3 = [math.sin(3*i) for i in x]
y4 = [math.sin(4*i) for i in x]
plt.figure(); plt.plot(x, y1) # รูปที่ 1
plt.figure(); plt.plot(x, y2) # รูปที่ 2
plt.figure(); plt.plot(x, y3) # รูปที่ 3
plt.figure(); plt.plot(x, y4) # รูปที่ 4
plt.show()
แต่ละ plt.figure() เปิดรูปใหม่ → ได้ 4 รูปแยกกัน
Matplotlib / pyplot
import matplotlib.pyplot as plt.plot() + .show()color, linewidth, linestyle, marker, 'xyz'.xlabel() .ylabel() .title() .legend()Bar plot
.bar() / .barh() · bar width · .xticks()Histogram & Pie
.hist(data, bins) · facecolor/edgecolor.pie() · labels · autopct · explode2D / Layout
.imshow() + cmap + .colorbar() — heatmap.subplot(r, c, loc) — หลาย chart ในภาพเดียว.figure(figsize=(w,h)) — รูปใหม่ / กำหนดขนาดTip
เลือกชนิดกราฟให้เหมาะกับข้อมูล → สื่อสารข้อมูลได้ชัดเจน
🏠 259201 — Module 11 | ภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเชียงใหม่