Matplotlib รองรับการเพิ่มตารางข้อมูล (table) ลงในกราฟได้โดยตรงผ่านเมธอด ax.table() เหมาะสำหรับการแสดงข้อมูลสรุป พร้อมกับการจัดรูปแบบเซลล์ สีพื้นหลัง และข้อความ
ขั้นตอนการทำงาน
- นำเข้า
numpy,pandas, และmatplotlib.pyplot - สร้าง Figure และ Axes ด้วย
plt.subplots() - สร้าง DataFrame จากข้อมูล (เช่น เวลาและความเร็ว)
- คำนวณขนาดตารางให้เหมาะสมกับ Figure
- เพิ่มตารางด้วย
ax.table()โดยระบุcellText,bbox, และcolLabels - ปิดการปรับขนาดฟอนต์อัตโนมัติด้วย
auto_set_font_size(False)แล้วตั้งค่าด้วยset_fontsize() - จัดรูปแบบเซลล์แต่ละเซลล์ผ่าน
mpl_table._cells.items():- ตั้งค่าสีขอบ (
set_edgecolor) - ตั้งค่าสีพื้นหลัง (
set_facecolor) - ตั้งค่าสีและน้ำหนักตัวอักษร (
set_text_props)
- ตั้งค่าสีขอบ (
- แสดงผลด้วย
plt.show()
ตัวอย่างโค้ด
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
fig, ax = plt.subplots()
df = pd.DataFrame(dict(
time=list(pd.date_range("2021-01-01 12:00:00", periods=10)),
speed=np.linspace(1, 10, 10)
))
size = (np.array(df.shape[::-1]) + np.array([0, 1])) * np.array([3.0, 6.0])
mpl_table = ax.table(cellText=df.values, bbox=[0, 0, 1, 1], colLabels=df.columns)
mpl_table.auto_set_font_size(False)
mpl_table.set_fontsize(12)
for k, cell in mpl_table._cells.items():
cell.set_edgecolor('black')
if k[0] == 0 or k[1] < 0:
cell.set_text_props(weight='bold', color='w')
cell.set_facecolor('red')
else:
cell.set_facecolor(['green', 'yellow'][k[0] % 2])
plt.show()
คำอธิบายโค้ดสำคัญ
bbox=[0, 0, 1, 1]- ตำแหน่งและขนาดตารางในพิกัด Axes (0-1)colLabels=df.columns- ใช้ชื่อคอลัมน์เป็นหัวตารางk[0]คือแถว (row),k[1]คือคอลัมน์ (column)- แถวที่ 0 (hdr) และคอลัมน์ -1 (index) จะได้รับสีพิเศษ
- สลับสีแถวคู่คี่ด้วย
['green', 'yellow'][k[0] % 2]
การปรับแต่งเพิ่มเติม
- ใช้
cellLoc='center'ในtable()เพื่อจัดกึ่งกลางข้อความ - เพิ่ม
edges='horizontal'เพื่อแสดงเฉพาะเส้นแนวนอน - สำหรับตารางขนาดใหญ่ ใช้
bboxที่เล็กลงเพื่อให้เหลือพื้นที่สำหรับกราฟ
การประยุกต์ใช้
เหมาะสำหรับรายงานแดชบอร์ด การแสดงข้อมูลสถิติพร้อมกราฟ หรือการสร้างรายงาน PDF ที่ต้องการตารางและกราฟในหน้าเดียวกัน