Máy tính bỏ túi đồ họa đã từng là công cụ không thể thiếu trong các khóa học toán và khoa học, nhưng chúng lại khá đắt đỏ trong khi công nghệ hầu như không thay đổi kể từ năm 1985. May mắn thay, với Python và các thư viện phù hợp, bạn có thể tạo ra vô số loại biểu đồ toán học và thống kê phức tạp một cách hoàn toàn miễn phí, với chất lượng vượt trội và khả năng tùy biến không giới hạn. Đây không chỉ là một giải pháp tiết kiệm mà còn là cánh cửa mở ra thế giới trực quan hóa dữ liệu mạnh mẽ, giúp bạn hiểu sâu hơn về các mối quan hệ và xu hướng.
Bài viết này sẽ hướng dẫn bạn cách tận dụng sức mạnh của Python để vẽ các loại biểu đồ phổ biến, từ những đường thẳng đơn giản đến các phân tích thống kê chuyên sâu, sử dụng các thư viện hàng đầu như NumPy, Matplotlib, SymPy và Seaborn.
Vẽ Biểu Đồ Cơ Bản Với NumPy và Matplotlib
Việc tạo ra các biểu đồ đường thẳng hay biểu đồ đa thức cơ bản bằng Python trở nên vô cùng dễ dàng. Một ưu điểm nổi bật là bạn sẽ có được những hình ảnh màu sắc sống động, độ phân giải cao, hoàn toàn khác biệt so với màn hình đơn sắc hạn chế của các máy tính bỏ túi đồ họa truyền thống, như từng được chỉ ra trong một strip truyện tranh nổi tiếng của xkcd. Để thực hiện điều này, bạn có thể chạy Python trực tiếp trong terminal hoặc sử dụng Jupyter Notebook để có trải nghiệm tương tác tốt hơn. Nếu bạn chọn terminal, IPython là một lựa chọn tuyệt vời với nhiều tính năng giúp sử dụng Python tương tác dễ dàng hơn, và nó cũng là nền tảng cho việc sử dụng Python trong Jupyter.
Để bắt đầu, chúng ta cần nhập thư viện NumPy và Matplotlib. NumPy là thư viện cốt lõi cho các phép toán số học trong Python, còn Matplotlib là thư viện vẽ đồ thị phổ biến nhất.
import numpy as np
Cú pháp as np
giúp bạn rút ngắn tên thư viện, tiện lợi hơn khi gõ lệnh.
Tiếp theo, hãy nhập Matplotlib:
import matplotlib.pyplot as plt
Nếu bạn đang làm việc trong Jupyter Notebook, các biểu đồ sẽ mặc định xuất hiện trong một cửa sổ riêng. Để chúng hiển thị trực tiếp trong notebook, bạn có thể sử dụng “lệnh magic” sau:
%matplotlib inline
Với những chuẩn bị ban đầu này, chúng ta đã sẵn sàng định nghĩa và vẽ các phương trình của mình.
Biểu Đồ Đường Thẳng (Linear Plot)
Để vẽ một phương trình đường thẳng, hãy nhớ lại dạng y = mx + b
, trong đó “m” là độ dốc (độ nghiêng của đường thẳng) và “b” là hệ số chặn y (điểm mà đường thẳng cắt trục y).
Chúng ta sẽ thiết lập trục x bằng lệnh np.linspace
, tạo ra một mảng các giá trị cách đều nhau. Lệnh sau sẽ tạo ra 50 điểm dữ liệu trên trục x trong khoảng từ -10 đến 10:
x = np.linspace(-10, 10, 50)
Chúng ta sẽ lưu độ dốc và hệ số chặn y vào các biến để dễ dàng thay đổi giá trị sau này. Ví dụ, m
là 3.5 và b
là 5:
m = 3.5
b = 5
Trục y sẽ được tính bằng cách nhân mỗi giá trị của x với độ dốc và cộng với hệ số chặn y:
y = m*x + b
Giờ là lúc tạo biểu đồ của chúng ta:
plt.plot(x, y)
plt.grid()
plt.xlabel("Trục X") # Thêm nhãn trục X
plt.ylabel("Trục Y") # Thêm nhãn trục Y
plt.title("Biểu đồ Đường thẳng: y = 3.5x + 5") # Thêm tiêu đề
plt.show() # Hiển thị biểu đồ
plt.plot()
là lệnh gọi Matplotlib để vẽ các giá trị x và y. plt.grid()
tạo một lưới phía sau biểu đồ giúp chúng ta nhìn rõ hơn các trục. plt.xlabel()
, plt.ylabel()
, plt.title()
giúp biểu đồ dễ hiểu hơn. Cuối cùng, plt.show()
hiển thị biểu đồ.
Biểu đồ đường thẳng tuyến tính y = 3.5x + 5 được vẽ bằng thư viện NumPy và Matplotlib trong Python
Biểu Đồ Đa Thức (Polynomial Plot)
Bạn có thể vẽ một phương trình bậc hai (quadratic equation) bằng phương pháp tương tự. Một phương trình bậc hai cổ điển có dạng ax² + bx + c
. Chúng ta có thể đặt các biến cho a, b, c và tạo trục x như sau:
x = np.linspace(-10, 10, 50)
a = 1
b = 2
c = -3
y = a*x**2 + b*x + c
plt.plot(x, y)
plt.grid()
plt.xlabel("Trục X")
plt.ylabel("Trục Y")
plt.title("Biểu đồ Phương trình Bậc hai: y = x^2 + 2x - 3")
plt.show()
Đồ thị parabol của phương trình bậc hai y = ax^2 + bx + c được tạo bằng NumPy và Matplotlib trong lập trình Python
Trong đại số, phép nhân thường được ngụ ý (ví dụ: “ax”), nhưng trong Python, bạn phải định nghĩa rõ ràng bằng ký hiệu *
(ví dụ: a*x
). Tương tự, **
là toán tử lũy thừa trong Python, nên x²
được viết là x**2
.
Các đa thức bậc cao hơn, như bậc ba (cubic) và bậc bốn (quartic), cũng hoạt động tương tự, chỉ cần thay đổi số mũ và thêm các hệ số tương ứng.
Tạo Biểu Đồ Đại Số Với SymPy
Một lựa chọn khác cho việc vẽ biểu đồ là SymPy, một thư viện đại số máy tính (computer algebra library) cho Python. SymPy hoạt động với các ký hiệu theo cách mà máy tính số học hoặc chương trình Python thông thường hoạt động với các con số. Tuy nhiên, đối với việc vẽ đồ thị, NumPy thường cung cấp cách định nghĩa phương trình ngắn gọn hơn, gần giống với cách bạn làm việc với bút và giấy. SymPy hữu ích hơn khi bạn cần giải các phương trình, tính đạo hàm, tích phân biểu tượng.
Bạn có thể cài đặt SymPy bằng pip:
pip install sympy
Để làm việc với SymPy, bạn phải nhập nó và định nghĩa các biến tượng trưng (symbolic variables). SymPy bao gồm một script có tên isympy
mà bạn có thể chạy từ terminal để tự động tải thư viện, định nghĩa một số biến phổ biến như x
và y
, thiết lập hiển thị “pretty-printing”, sau đó bắt đầu một phiên tương tác. Bạn cũng có thể thiết lập nó trong Jupyter Notebook hoặc phiên Python tương tác thông thường:
from sympy import *
x = symbols('x')
init_printing()
Dòng lệnh này cho Python biết để nhập tất cả các hàm từ SymPy vào không gian tên chính, định nghĩa một biến x
tượng trưng và thiết lập “pretty printing” – giúp đầu ra trông giống như trong sách giáo khoa toán học. Các biến tượng trưng phải được định nghĩa trước khi bạn có thể sử dụng chúng với SymPy.
Chúng ta có thể sử dụng các biến thông thường cho các hệ số như đã làm với NumPy. Hãy vẽ lại phương trình đường thẳng từ trước bằng SymPy:
m = 3.5
b = 5
plot(m*x + b, (x, -10, 10), title="Biểu đồ Đường thẳng với SymPy")
Biểu đồ phương trình đường thẳng y = 3.5x + 5 được vẽ bằng thư viện SymPy, hiển thị trục tọa độ tích hợp
Hàm plot
tạo ra một biểu đồ 2D với dạng phương trình đường thẳng, và phần (x, -10, 10)
chỉ định phạm vi của đồ thị, từ giá trị x là -10 đến 10. Đây cũng sẽ là phạm vi mặc định nếu bạn bỏ qua phần này. Bạn có thể thấy các trục được tích hợp ngay trong biểu đồ.
Hãy nhớ đóng tất cả các dấu ngoặc đơn. IPython và Jupyter sẽ giúp bạn bằng cách làm nổi bật các dấu ngoặc khi bạn gõ.
Các phương trình bậc hai và các đa thức khác cũng hoạt động tương tự:
a = 1
b = 2
c = -3
plot(a*x**2 + b*x + c, (x, -10, 10), title="Biểu đồ Phương trình Bậc hai với SymPy")
Đồ thị parabol của phương trình bậc hai được tạo bằng SymPy, minh họa cách vẽ đồ thị đại số trong Python
Trực Quan Hóa Dữ Liệu Thống Kê Với Seaborn
Ngoài việc vẽ các đường thẳng và đường cong toán học, Python còn có thể được sử dụng để tạo các biểu đồ thống kê mạnh mẽ. Mặc dù bạn có thể làm điều này trong một bảng tính như Excel, LibreOffice Calc hoặc Google Sheets, nhưng tôi thấy đầu ra từ Python trông đẹp mắt và chuyên nghiệp hơn rất nhiều.
Trong phần này, chúng ta sẽ sử dụng thư viện Seaborn, một công cụ tôi đã từng giới thiệu, để trực quan hóa dữ liệu thống kê bằng Python, tương tự như cách bạn sẽ làm với máy tính bỏ túi đồ họa trong một lớp học thống kê nhưng với khả năng tùy chỉnh cao hơn.
Bạn có thể cài đặt Seaborn bằng pip:
pip install seaborn
Hãy nhập Seaborn vào phiên IPython hoặc Jupyter Notebook của chúng ta:
import seaborn as sns
Giống như NumPy, việc nhập theo cách này sẽ giúp bạn tiết kiệm thời gian gõ lệnh.
Seaborn có một số tập dữ liệu mẫu được tích hợp sẵn để bạn thực hành. Chúng ta sẽ sử dụng tập dữ liệu về tiền boa (tips) tại các nhà hàng ở New York:
tips = sns.load_dataset('tips')
Chúng ta có thể xem các cột của tập dữ liệu này, vốn có định dạng Pandas DataFrame (tương tự như một bảng tính), bằng cách sử dụng hàm head()
:
tips.head()
Bảng dữ liệu mẫu 'tips' hiển thị 5 hàng đầu tiên trong môi trường Jupyter Notebook, minh họa cấu trúc dữ liệu cho Seaborn
Bạn thậm chí có thể nhập dữ liệu bảng tính của riêng mình từ Excel hoặc các chương trình khác. Ví dụ, để đọc một tệp CSV:
import pandas as pd
data = pd.read_csv("/path/to/data.csv")
Với dữ liệu đã được tải, chúng ta có thể bắt đầu khám phá nó.
Biểu Đồ Cột (Bar Chart)
Để xem biểu đồ cột đơn giản về tổng hóa đơn trong các ngày trong tuần, hãy sử dụng hàm catplot
:
sns.catplot(x='day', y='total_bill', kind='bar', data=tips)
plt.title("Tổng Hóa Đơn Nhà Hàng Theo Ngày")
plt.xlabel("Ngày trong tuần")
plt.ylabel("Tổng hóa đơn ($)")
plt.show()
Biểu đồ cột thể hiện tổng hóa đơn tại nhà hàng theo các ngày trong tuần, được tạo bằng thư viện Seaborn
Biểu Đồ Histogram (Phân Phối Dữ Liệu)
Một biểu đồ hữu ích khác là histogram, giúp thể hiện sự phân phối của dữ liệu. Để xem các khoản tiền boa phổ biến nhất, hãy sử dụng hàm displot
:
sns.displot(x='tip', data=tips, kde=True) # Thêm kde=True để vẽ đường ước tính mật độ hạt nhân
plt.title("Phân phối Tiền boa tại Nhà hàng")
plt.xlabel("Số tiền boa ($)")
plt.ylabel("Tần suất")
plt.show()
Biểu đồ histogram phân phối tiền boa tại nhà hàng, minh họa tần suất các khoản tiền boa bằng Seaborn và Python
Biểu Đồ Hộp (Boxplot)
Biểu đồ hộp (boxplot), hay chính xác hơn là biểu đồ hộp và râu (box-and-whisker plot), sẽ giúp bạn trực quan hóa phạm vi dữ liệu của mình. Hãy xem xét lại tổng hóa đơn, nhưng thay đổi loại biểu đồ từ biểu đồ cột sang biểu đồ hộp:
sns.catplot(x='day', y='total_bill', kind='box', data=tips)
plt.title("Phân bố Tổng Hóa Đơn theo Ngày")
plt.xlabel("Ngày trong tuần")
plt.ylabel("Tổng hóa đơn ($)")
plt.show()
Biểu đồ hộp (boxplot) của tổng hóa đơn nhà hàng theo ngày, hiển thị phân vị và giá trị ngoại lai bằng Seaborn
Các hộp hiển thị 50% dữ liệu ở giữa, hay còn gọi là khoảng tứ phân vị (IQR), với đường kẻ ở giữa biểu thị giá trị trung vị (median). Các đường ở phía trên và phía dưới, được gọi là “râu” (whiskers), biểu thị các giá trị tối đa và tối thiểu trong một phạm vi nhất định (thường là 1.5 lần IQR), còn các điểm nằm ngoài râu là các điểm ngoại lai (outliers).
Biểu Đồ Phân Tán (Scatterplot) và Hồi Quy Tuyến Tính (Regression Plot)
Một cách mạnh mẽ để xem xét dữ liệu là thông qua biểu đồ phân tán và hồi quy. Biểu đồ phân tán xem xét một biến độc lập trên trục x so với một biến phụ thuộc trên trục y để xem liệu có mối quan hệ nào giữa chúng không.
Hãy cùng xem mối quan hệ giữa tiền boa và tổng hóa đơn tại nhà hàng:
sns.relplot(x='total_bill', y='tip', data=tips)
plt.title("Mối quan hệ giữa Tiền boa và Tổng hóa đơn")
plt.xlabel("Tổng hóa đơn ($)")
plt.ylabel("Số tiền boa ($)")
plt.show()
Biểu đồ phân tán (scatterplot) mối quan hệ giữa tiền boa và tổng hóa đơn tại nhà hàng, được tạo bằng Seaborn
Bạn có nhận thấy các giá trị dường như nằm gần một đường thẳng không? Chúng ta có thể trực quan hóa điều này bằng một đường hồi quy sử dụng hàm regplot
. Nó về cơ bản là hàm “relplot” được thay đổi một chữ cái:
sns.regplot(x='total_bill', y='tip', data=tips)
plt.title("Hồi quy Tuyến tính của Tiền boa và Tổng hóa đơn")
plt.xlabel("Tổng hóa đơn ($)")
plt.ylabel("Số tiền boa ($)")
plt.show()
Biểu đồ hồi quy tuyến tính (regression plot) giữa tiền boa và tổng hóa đơn, hiển thị đường hồi quy trên biểu đồ phân tán bằng Seaborn
Bạn sẽ thấy đường hồi quy được chồng lên biểu đồ phân tán gốc. Bạn có thể thực hiện phân tích hồi quy chính thức hơn để xác định mức độ tương quan, nhưng chỉ bằng cách xem xét đường thẳng so với các điểm dữ liệu, chúng ta đã có thể thấy một sự phù hợp khá tốt.
Kết Luận
Mặc dù bạn có thể vẫn cần giữ lại máy tính bỏ túi đồ họa cho các kỳ thi, nhưng khi làm bài tập, khám phá dữ liệu hoặc đơn giản là thử nghiệm, Python cung cấp một nền tảng vượt trội để tạo ra các biểu đồ. Với sức mạnh của các thư viện như NumPy, Matplotlib, SymPy và Seaborn, bạn có thể tạo ra những biểu đồ đẹp mắt, chuyên nghiệp và đầy đủ thông tin một cách hoàn toàn miễn phí.
Python không chỉ là một ngôn ngữ lập trình mà còn là một công cụ trực quan hóa dữ liệu mạnh mẽ, giúp bạn tiết kiệm chi phí và khai thác tối đa tiềm năng của dữ liệu. Hãy bắt đầu khám phá và chia sẻ những biểu đồ độc đáo của bạn với cộng đồng!
Bạn đã từng sử dụng Python để vẽ biểu đồ chưa? Hãy chia sẻ kinh nghiệm và những thách thức của bạn trong phần bình luận bên dưới, hoặc xem thêm các hướng dẫn lập trình Python khác trên thichcongnghe.net để nâng cao kỹ năng của bạn!