Bài 15. matplotlib and seaborn
Tác giả: Đặng Quý Anh
1. Thư viện matplotlib
matplotlib
là một thư viện trong Python phục vụ cho việc trực quan hóa dữ liệu phục vụ cho việc suy luận thống kê.
Và module được phổ biến trong matplotlib là pyplot - chứa các hàm cơ bản để vẽ, thiết lập khung hình.
Dưới đây là một đoạn code minh họa khi sử dụng thư viện matplotlib:
# import library
import numpy as np
from matplotlib import pyplot as plt
# initialize function
f = lambda x: np.sin(2 * np.pi * x)
g = lambda x: np.cos(2 * np.pi * x)
# split lower bound and upper bound into 1000 range by 1001 points
lb, ub = -2, 2
x = np.linspace(lb, ub, 1001)
y1 = f(x)
y2 = g(x)
# plot
plt.figure(figsize=(15, 10))
plt.plot(x, y1, '--', color='blue', label='sin(x)')
plt.plot(x, y2, '-', color='red', label='cos(x)')
plt.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.title('Draw sin(x) and cos(x)', fontsize=18)
plt.legend(fontsize=14)
plt.grid()
plt.savefig('demo-matplotlib.png')
plt.show()
trong đó,
plt.figure
: thiết lập kích thước khung hình (view)plt.plot(x, y1, '--', color='blue', label='sin(x)')
: vẽ đồ thị của $y_1$ theo $x$ với nét đứt (--
), màu xanh và với nhãn làsin(x)
plt.plot(x, y2, '--', color='red', label='cos(x)')
: vẽ đồ thị của $y_2$ theo $x$ với nét liền (-
), màu đỏ và với nhãn làcos(x)
plt.xlabel('x', fontsize=14)
: đặt trên cho trục $x$ với cỡ chữ 14plt.ylabel('y', fontsize=14)
: đặt trên cho trục $y$ với cỡ chữ 14plt.title('Draw sin(x) and cos(x)', fontsize=18)
: đặt tên cho hình vẽ với cỡ chữ 18plt.legend(fontsize=14)
: thiết lập nhãn cho các hàm đã vẽ qua label đã gán ỡ mỗi hàmplt.plot
plt.grid()
: thiết lập lưới cho miền vẽplt.savefig('demo-matplotlib.png')
: để lưu lại hình đã vẽ dưới tên truyền vàoplt.show()
: để hiển thị hình vẽ
Tuy nhiên, ta cũng có thể vẽ hai hàm số $sin(x)$ và $cos(x)$ ở 2 khung hình khác nhau bằng cách sử dụng plt.subplot
# import library
import numpy as np
from matplotlib import pyplot as plt
# initialize function
f = lambda x: np.sin(2 * np.pi * x)
g = lambda x: np.cos(2 * np.pi * x)
# split lower bound and upper bound into 1000 range by 1001 points
lb, ub = -2, 2
x = np.linspace(lb, ub, 1001)
y1 = f(x)
y2 = g(x)
plt.figure(figsize=(20, 10))
# Draw sin(x)
plt.subplot(1, 2, 1)
plt.plot(x, y1, '--', color='blue', label='sin(x)')
plt.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.title('Draw sin(x)', fontsize=18)
plt.grid()
# Draw cos(x)
plt.subplot(1, 2, 2)
plt.plot(x, y2, '-', color='red', label='cos(x)')
plt.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.title('Draw cos(x)', fontsize=18)
plt.grid()
# display
plt.show()
Các hàm vẽ cơ bản vẫn hoàn toàn như phần trước, nhưng thêm plt.subplot(m, n, position)
- nghĩa là khung hình sẽ được chia làm $m$ hàng, $n$ cột (tức là có $m \times n$ hình vẽ con), và postition
là vị trí hình vẽ hiện tại.
Bên cạnh plt.subplot
, chúng ta cũng có thể dùng hàm gần tương tự nhưng đa dụng trong nhiều trường hợp hơn là plt.subplots
.
Ngoài ra, pyplot còn cung cấp các hàm vẽ sau:
plt.scatter
: vẽ biểu đồ phân tánplt.bar
: vẽ biểu đồ cộtplt.boxplot
: vẽ biểu đồ ria mèoplt.pie
: vẽ biểu đồ tròn- …
2. Thư viện seaborn
seaborn là mở rộng, kế thừa từ matplotlib, để thực hiện trực quan hóa dữ liệu, nhưng thường được dùng với kiểu dữ liệu từ DataFrame
.
seaborn cũng đa dạng các hàm để vẽ hơn và có thể được chia thành một số nhóm chính như sau
- Nhóm các hàm vẽ quan hệ
scatterplot
: vẽ biểu đồ phân tánlineplot
: vẽ biểu đồ đường
- Nhóm các hàm vẽ phân bố
displot
: vẽ phân bố của biếnhistplot
: vẽ biểu đồhistorygrams
của biếnkdeplot
: vẽ đường xấp xỉ phân bố của biến
- Nhóm các hàm dành cho biến rời rạc
boxplot
: vẽ biểu đồ ria mèobarplot
: vẽ biểu đồ cộtcountplot
: vẽ biều đồ theo số lượng biếnswarmplot
: vẽ biểu đồ phân tán phân loại với các điểm không trùng nhau
- Ngoài ra, còn có các nhóm: nhóm các hàm vẽ biến hồi quy, nhóm vẽ ma trận, nhóm để vẽ cho nhiều hình, …
Sau đây là một ví dụ khi dùng seaborn
kết hợp matplotlib
trên kiểu dữ liệu DataFrame
.
Dữ liệu dùng trong bài học được lấy từ thư viện seaborn
(xem chi tiết tại đây).
import seaborn as sns
# set fontsize
sns.set(font_scale=1.5)
# load dataframe
iris = sns.load_dataset('iris')
plt.figure(figsize=(20, 20))
# use countplot
plt.subplot(2, 2, 1)
sns.countplot(x='species', data=iris)
# use kdeplot
plt.subplot(2, 2, 2)
sns.kdeplot(x='petal_length', data=iris)
# use boxplot
plt.subplot(2, 2, 3)
sns.boxplot(x='petal_length', data=iris)
# use scatterplot
plt.subplot(2, 2, 4)
sns.scatterplot(x='petal_length', y='petal_width', data=iris)
# display
plt.show()
Nội dung trên chỉ là tóm tắt, học viên cần đọc các tài liệu liệt kê trong phần tài liệu tham khảo dưới đây.
Tài liệu tham khảo
Tài liệu chính
- Trang chủ matplotlib
- Trang chủ seaborn
Tài liệu bổ sung
- Hướng dẫn sử dụng matplotlib trên trang web Real Python
- SeriousPython (trang 27-32)