Python được sử dụng nhiều nhất trong lĩnh vực phân tích dữ liệu, mà trong khoa học dữ liệu, công việc trực tiếp hóa thông tin qua các thị đồ, biểu đồ giúp chúng tôi hiểu được các mối quan hệ trong dữ liệu dễ dàng hơn rất nhiều. Matplotlib là một thư viện được sử dụng để vẽ các thị đồ trong Python
Matplotlib là thư viện trực quan hóa dữ liệu kết hợp trong Python. Nó được tạo ra bởi John Hunter. Đây là một thư viện đồ họa 2D và 3D tuyệt vời để tạo ra các số liệu khoa học.
Bạn có thể tìm hiểu thêm tại đây: //matplotlib.org/
Nào! Giờ chúng ta sẵn sàng để học nó rồi chứ, trước khi bắt đầu, bạn hãy mở google colab và import thư viện này vào nhé!
import matplotlib.pyplot as pltTrong google colab mặc định thư viện này đã được cài sẵn, nếu bạn sử dụng trên VS Code hay trên pycharm nhớ cài đặt bằng nhé
pip install matplotlibNếu bạn đang sử dụng Jupiter notebook hãy thêm dòng lệnh này vào để hiển thị trong các ô output
%matplotlib inlineNếu bạn đang sử dụng trình soạn thảo khác, bạn sẽ sử dụng: plt.show [] ở cuối tất cả các lệnh vẽ biểu đồ của mình để hình hiển thị
Rồi, bây giờ chúng ta tìm hiểu về nó.
Đầu tiên để vẽ biểu đồ, ta cần dữ liệu, ta tạo 2 mảng numpy để lấy dữ liệu thực hành nhé!
import numpy as np x = np.linspace[0, 5, 11] y = x ** 2Vẽ biểu đồ đơn giản bằng Matplotlib
Chúng ta có thể tạo một biểu đồ line rất đơn giản bằng cách sử dụng cách sau
plt.plot[x, y, 'r'] # 'r' là màu đỏ plt.xlabel['X Axis Title Here'] plt.ylabel['Y Axis Title Here'] plt.title['String Title Here']Output:
Tạo nhiều đồ thị trên cùng một biểu đồ
Để tạo như vậy ta dùng hàm subplot[], với đối số đầu tiên là số dòng, đối số thứ 2 là số cột, và đối số thứ 3 là vị trí biểu đồ, bắt đầu từ vị trí 1
plt.subplot[1,2,1] plt.plot[x, y, 'r--'] # More on color options later plt.subplot[1,2,2] plt.plot[y, x, 'g*-'];Output:
Vẽ theo phương pháp hướng đối tượng Matplotlib
Điều này có nghĩa là chúng ta sẽ khởi tạo các đối tượng biểu đồ và sau đó gọi các phương thức hoặc thuộc tính từ đối tượng đó.
Cách tiếp cận này sẽ đẹp hơn khi xử lý một biểu đồ có nhiều đồ thị trên đó. Để bắt đầu, chúng ta tạo một ví dụ biểu đồ. Sau đó, chúng ta có thể thêm các trục vào biểu đồ đó:
# Tạo một đối tượng figure[biểu đồ trống] fig = plt.figure[] axes = fig.add_axes[[0.1, 0.1, 0.8, 0.8]]# left, bottom, width, height [khoảng từ 0 đến 1] print[axes]Output: ta có một khung cho biểu đồ trống
Sau đó ta vẽ biểu đồ vào đối tượng vừa tạo
axes.plot[x, y, 'b'] axes.set_xlabel['Set X Label'] # Notice the use of set_ to begin methods axes.set_ylabel['Set y Label'] axes.set_title['Set Title']Output:
Giờ phức tạp hơn một chút nhé, nhưng ưu điểm là giờ đây chúng ta có toàn quyền kiểm soát vị trí đặt các trục của khung biểu đồ và chúng ta có thể dễ dàng thêm nhiều trục vào
fig = plt.figure[]# Khai báo một đối tượng cho biểu đồ axes1 = fig.add_axes[[0.1, 0.1, 0.8, 0.8]] #khai báo Trục chính axes2 = fig.add_axes[[0.2, 0.5, 0.4, 0.3]] # Khai báo trục thêm vào # đối tượng Figure chính Axes 1 axes1.plot[x, y, 'b'] axes1.set_xlabel['X_label_axes2'] axes1.set_ylabel['Y_label_axes2'] axes1.set_title['Axes 2 Title'] # đối tượng Figure thêm vào Axes 2 axes2.plot[y, x, 'r'] axes2.set_xlabel['X_label_axes2'] axes2.set_ylabel['Y_label_axes2'] axes2.set_title['Axes 2 Title'];Output:
Đối tượng subplot[]
Đối tượng plt.subplots [] sẽ hoạt động như một trình quản lý trục tự động hơn. Ta có thể khai báo luôn đối tượng axes ngay trong subplot
fig, axes = plt.subplots[]# Khai báo một đối tượng subplot # Bây giờ ta có thể sử dụng đối tượng axes để vẽ đồ thị axes.plot[x, y, 'r'] axes.set_xlabel['x'] axes.set_ylabel['y'] axes.set_title['title'];Output:
Ta có thể chỉ định số hàng và cột khi tạo đối tượng subplots []:
fig, axes = plt.subplots[nrows=1, ncols=2]Output:
Ta có thể lặp qua mảng axes để vẽ
for ax in axes: ax.plot[x, y, 'b'] ax.set_xlabel['x'] ax.set_ylabel['y'] ax.set_title['title'] fig # Gọi đối tượng đã vẽ raOutput:
Một vấn đề phổ biến với matplotlib là các ô hoặc số liệu con chồng chéo lên nhau. Chúng ta có thể sử dụng phương thức fig.tight_layout [] hoặc plt.tight_layout [], tự động điều chỉnh vị trí của các trục trên canvas hình để không có nội dung chồng chéo:
fig, axes = plt.subplots[nrows=1, ncols=2] for ax in axes: ax.plot[x, y, 'g'] ax.set_xlabel['x'] ax.set_ylabel['y'] ax.set_title['title'] fig plt.tight_layout[]Output:
Bạn thấy biểu đồ bên dưới đã được tự động nới ra, không bị chồng chéo chữ “y” lên biểu đồ đầu tiên
Kích thước biểu đồ và độ nét ảnh biểu đồ [DPI]
Matplotlib cho phép xác định kích thước hình ảnh, DPI khi đối tượng biểu đồ được tạo. Bạn có thể sử dụng các đối số từ khóa figsize và dpi. DPI càng cao, hình ảnh càng nét và dung lượng cũng tăng theo, thông thường ta nên để dpi mặc định, hoặc trong khoảng từ 100 đến 200 dpi
Chiều rộng và chiều cao figsize được tính bằng inch
fig, axes = plt.subplots[figsize=[12,3], dpi = 100] axes.plot[x, y, 'r'] axes.set_xlabel['x'] axes.set_ylabel['y'] axes.set_title['title'];Output:
Ta thấy kích thước biểu đồ lớn ra.
Lưu biểu đồ
ta dùng lệnh savefig để lưu lại biểu đồ đã vẽ, với đường dẫn và tên file ảnh
fig.savefig["path/filename.png"]Tại đây, chúng ta cũng có thể tùy chọn chỉ định DPI và chọn giữa các định dạng đầu ra khác nhau:
fig.savefig["filename.png", dpi = 200]Nhãn và tiêu đề biểu đồ
Một tiêu đề có thể được thêm vào mỗi trường hợp trục trong một hình. Để đặt tiêu đề, hãy sử dụng phương thức set_title
ax.set_title["title"]Tương tự, với các phương thức set_xlabel và set_ylabel, chúng ta có thể đặt nhãn của trục X và Y:
ax.set_xlabel["x"] ax.set_ylabel["y"];Hàm Legend
Phương thức này sẽ hiển thị chú giải trong biểu đồ
fig = plt.figure[] ax = fig.add_axes[[0,0,1,1]] ax.plot[x, x**2, label="x**2"] ax.plot[x, x**3, label="x**3"] ax.legend[]Output:
Màu sắc, kiểu đường vẽ và chiều rộng đường vẽ
Màu sắc
Với matplotlib, chúng ta có thể xác định màu sắc của đường thẳng và các yếu tố đồ họa khác theo một số cách. Trước hết, chúng ta có thể sử dụng cú pháp giống MATLAB trong đó ‘b’ có nghĩa là màu xanh lam, ‘g’ có nghĩa là màu xanh lá cây, v.v. API MATLAB để chọn kiểu dòng cũng được hỗ trợ: ví dụ: trong đó, ‘b.-‘ có nghĩa là a đường màu xanh lam với các dấu chấm
fig, ax = plt.subplots[] ax.plot[x, x**2, 'b.-'] # blue line with dots ax.plot[x, x**3, 'g--'] # green dashed lineOutput:
Chúng ta có thể thêm màu sắc theo các cách sau
fig, ax = plt.subplots[] ax.plot[x, x+1, color="blue", alpha=0.5] # half-transparant ax.plot[x, x+2, color="#8B008B"] # RGB hex code ax.plot[x, x+3, color="#FF8C00"] # RGB hex codeĐộ rộng và kiểu line
Để thay đổi độ rộng dòng, chúng ta có thể sử dụng đối số từ khóa line width hoặc lw. Kiểu dòng có thể được chọn bằng cách sử dụng các đối số từ khóa linestyle hoặc ls:
Chúng ta sẽ tham khảo các lệnh vẽ dưới đây để tiện khi sử dụng
fig, ax = plt.subplots[figsize=[12,6]] ax.plot[x, x+1, color="red", linewidth=0.25] ax.plot[x, x+2, color="red", linewidth=0.50] ax.plot[x, x+3, color="red", linewidth=1.00] ax.plot[x, x+4, color="red", linewidth=2.00] # possible linestype options ‘-‘, ‘–’, ‘-.’, ‘:’, ‘steps’ ax.plot[x, x+5, color="green", lw=3, linestyle='-'] ax.plot[x, x+6, color="green", lw=3, ls='-.'] ax.plot[x, x+7, color="green", lw=3, ls=':'] # custom dash line, = ax.plot[x, x+8, color="black", lw=1.50] line.set_dashes[[5, 10, 15, 10]] # format: line length, space length, ... # possible marker symbols: marker = '+', 'o', '*', 's', ',', '.', '1', '2', '3', '4', ... ax.plot[x, x+ 9, color="blue", lw=3, ls='-', marker='+'] ax.plot[x, x+10, color="blue", lw=3, ls='--', marker='o'] ax.plot[x, x+11, color="blue", lw=3, ls='-', marker='s'] ax.plot[x, x+12, color="blue", lw=3, ls='--', marker='1'] # marker size and color ax.plot[x, x+13, color="purple", lw=1, ls='-', marker='o', markersize=2] ax.plot[x, x+14, color="purple", lw=1, ls='-', marker='o', markersize=4] ax.plot[x, x+15, color="purple", lw=1, ls='-', marker='o', markersize=8, markerfacecolor="red"] ax.plot[x, x+16, color="purple", lw=1, ls='-', marker='s', markersize=8, markerfacecolor="yellow", markeredgewidth=3, markeredgecolor="green"];Output:
Phóng to biểu đồ
Chúng ta có thể cấu hình phạm vi của các trục bằng cách sử dụng phương thức set_ylim và set_xlim trong đối tượng trục. Xem qua ví dụ ba đồ thị bên dưới đây bạn sẽ dễ hiểu hơn.
fig, axes = plt.subplots[1, 3, figsize=[12, 4]] axes[0].plot[x, x**2, x, x**3] axes[0].set_title["default axes ranges"] axes[1].plot[x, x**2, x, x**3] axes[1].axis['tight'] axes[1].set_title["tight axes"] axes[2].plot[x, x**2, x, x**3] axes[2].set_ylim[[0, 60]] axes[2].set_xlim[[2, 5]] axes[2].set_title["custom axes range"];Output:
Các dạng biểu đồ trong matplotlib
Ngoài biểu đồ line mà ta đã học phía trên, ta còn có các dạng biểu đồ như barplots, histograms, scatter plots… những biểu đồ dạng này ta nên vẽ trong seaborn, nhưng ta cũng xem qua cho biết
Biểu đồ phân tán scatter
plt.scatter[x,y]Output:
Biểu đồ Histograms
from random import sample data = sample[range[1, 1000], 100] plt.hist[data]Output:
Biểu đồ box
data = [np.random.normal[0, std, 100] for std in range[1, 4]] # rectangular box plot plt.boxplot[data,vert=True,patch_artist=True];Output:
Phần thực hành
Bạn tải file thực hành phần bài học này theo link bên dưới, sau đó tải lên Google Drive của bạn để thực hành.
Nếu chưa biết sử dụng Google colab, bạn xem hướng dẫn tại đây: //pythonnangcao.com/khoa-hoc/bai-2-hoc-python-bang-google-colab/
Chúc bạn học tốt!