AI Cho Mọi Người

AI Cho Mọi Người

Đọc thêm về matplotlib

 

 

Matploblib là một thư viện trực quan hoá dữ liệu phổ biến trong Python. Nó có thể vẽ được nhiều loại đồ thị khác nhau, và rất hữu ích khi làm việc cùng với NumPy.

Hướng dẫn này nhằm giúp các bạn nhanh chóng cách sử dụng được các chức năng cơ bản của Matplotlib.

 

1. Hướng dẫn cài đặt
– Nếu bạn có Anacoda, bạn có thể cài đặt dễ dàng từ Terminal:

conda install matplotlib

– Hoặc cài đặt Matplotlib từ Terminal bằng:

pip install matplotlib

2. Cấu trúc của Plot
Gồm 2 phần chính là: Figure & Axes

Figure: là cửa sổ chứa tất cả mọi thứ được vẽ trên nó. Nó có thể chứa nhiều thành phần độc lập nhau như: các Axes khác nhau, tiêu đề, chú thích.
Axes: là khu vực chứa dữ liệu được vẽ lên và các tiêu đề, chú thích gắn với nó.

 

3. Làm việc với matplotlib

Chúng ta sẽ bắt đầu bằng việc Import thư viện

# Chúng ta có thể sử dụng cách Import này 
from matplotlib import pyplot as plt 

# Hoặc một cách ngắn gọn hơn 
import matplotlib.pyplot as plt

 

Có 2 cách tiếp cận để vẽ 1 Plot
Cách 1: Sử dụng lệnh Matplotlib cơ bản

Một vài cú pháp cơ bản:

plt.figure(): tạo một figure

plt.plot(): vẽ đồ thị với giá trị trục x so với trục y

plt.xlabel(): đặt tên cho trục x

plt.ylabel(): đặt tên cho trục y

plt.title(): đặt tên cho figure

plt.grid(): hiển thị các đường lưới

plt.legend(): hiển thị chú thích cho đồ thị

plt.savefig(): lưu hình về máy

plt.show(): hiển thị hình vẽ

plt.clf(): xoá hình hiện tại (hữu ích khi có nhiều figure trong 1 chương trình)

 

Ví dụ: vẽ đồ thị hàm số: \(y = x^3\)

import numpy as np
x = np.arange(-5, 5, 0.01)
y = x ** 3

# Đặt tên 
plt.title('Hàm y = x^3')
plt.xlabel('Trục x')
plt.ylabel('Trục y')

# Hiển thị lưới 
plt.grid()

# Vẽ plt.plot()
plt.plot(x, y, label='y = x^3')

# HIển thị chú thích 
plt.legend()

# Hiển thị hình vẽ
plt.show()

Hình kết quả cho đoạn code trên

 

Hơn nữa, Matplotlib còn cho chúng ta có thể vẽ nhiều hình trên 1 Figure:
– Chúng ta có thể sử dụng phương thức subplot() gồm có 3 thông số sau
nrows: số lượng hàng trên Figure

ncols: số lượng cột trên Figure

plot_number: vị trí của plot trong Figure

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-5, 5, 0.01)
y = x ** 3

# plt.subplot(nrows, ncols, plot_number)
# nrows = 1, ncols = 2 (1 hàng, 2 cột)
plt.subplot(1, 2, 1) # vẽ ở vị trí 1
plt.plot(x, y, 'red')

plt.subplot(1, 2, 2) # vẽ ở vị trí 2
plt.plot(x, y, 'green')

plt.show()

Hình kết quả cho đoạn code trên

 

Cách 2: Phương thức hướng đối tượng

Như đã nói ở trên, thành phần chính của figure là các axes. Một figure có thể chứa một hoặc nhiều axes. Hay nói cách khác, figure chỉ là khung chứa, chính xác axes mới thật sự là nơi các hình được vẽ lên.

Bây giờ chúng ta  thêm các axes vào figure, bằng phương thức add_axes() gồm 4 đối số: (bên trái, phía dưới, chiều rộng, chiều cao).

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-5, 5, 0.01)
y = x ** 3

# Khởi tạo figure trống
fig = plt.figure()

# Có thể gọi tắt subplot(1,1,1) thành subplot(111)
fig.add_subplot(111)

# facecolor là màu nền 
ax = fig.add_axes([0, 0.5, 0.5, 0.5], facecolor='#BECAFB')
ax.plot(x, y, 'red')

# Hiển thị figure hiện tại 
plt.show()

Hình kết quả cho đoạn code trên

 

Thêm tiêu đề cho các axes bằng cách dùng các hàm
set_xlabel(): tiêu đề trục x
set_ylabel(): tiêu đề trục y
set_title(): tiêu đề axes

 

Code sau tạo hai subplot

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-5, 5, 0.01)
y = x ** 3

# Khởi tạo figure trống
fig = plt.figure()

# Có thể gọi tắt subplot(1,1,1) thành subplot(111)
fig.add_subplot(111)

ax = fig.add_axes([0, 0.5, 0.5, 0.5], facecolor='#BECAFB')
ax.plot(x, y, 'red')

ax.set_xlabel('Trục x')
ax.set_ylabel('Trục y')
ax.set_title('Hình thứ 1')

# Tạo thêm 1 axes trong cùng 1 figure
ax2 = fig.add_axes([0.5, -0.1, 0.5, 0.5])

x = np.linspace(0, 2, 100)
ax2.plot(x, x, label='linear')
ax2.plot(x, x**2, label='quadratic')
ax2.plot(x, x**3, label='cubic')

ax2.set_xlabel('Trục x')
ax2.set_ylabel('Trục y')
ax2.set_title('Hình thứ 2')
ax2.legend()

# Hiển thị figure hiện tại 
plt.show()

Hình kết quả cho đoạn code trên

 

 

Một số thuộc tính khác của Figure
1. Chỉnh kích thước của Figure bằng phương thức figsize() (đơn vị inch).
2. dpi độ phân giải của hình, giá trị mặc định là 100. dpi càng cao thì chất lượng ảnh càng cao.
3. Lưu Figure bằng fig.savefig()

 

Code ví dụ

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-5, 5, 0.01)
y = x ** 3

# Khởi tạo nhanh Figure và Axes -> plt.subplots()
fig, ax = plt.subplots(figsize=(10,5))

x = np.linspace(0, 2, 100)
ax.plot(x, x, label='linear')
ax.plot(x, x**2, label='quadratic')
ax.plot(x, x**3, label='cubic')

ax.set_xlabel('Trục x')
ax.set_ylabel('Trục y')
ax.set_title('Hình thứ 2')
ax.legend()

plt.show()

# Lưu figure cùng thư mục với code 
fig.savefig('my_figure.png')

Hình kết quả cho đoạn code trên

 

Kiểm tra Figure đã lưu hay chưa?

import matplotlib.image as mpimg 

# Hiển thị hình ảnh lưu trong máy 
plt.imshow(mpimg.imread('my_figure.png'))

 

Để xoá nội dung của figure, chúng ta dùng hàm fig.clf() hay plt.clf(). Để đóng một figure, chúng ta dùng hàm plt.close(<Tên fig>).

 

Chỉnh trục toạ độ trong Figure ( Spines và Ticks của đồ thị )

Axis spine: đường ghi nhận ranh giới khu vực dữ liệu. Spine là đường kết nối các dấu ticks trên trục và ghi nhận ranh giới của khu vực dữ liệu. Chúng ta có thể cài đặt tuỳ ý.

Ví dụ: khảo sát và vẽ đồ thị hàm số \(y = sin(x)\)

Trong trường hợp chưa chỉnh các trục toạ độ

# Trong trường hợp chưa chỉnh các trục toạ độ

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10., 10., 0.2)
y = np.sin(x)

plt.plot(x, y)
plt.show()

Hình kết quả cho đoạn code trên

 

Chỉnh lại trục toạ độ

# Chỉnh lại trục toạ độ 

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10,6))
x = np.arange(-10., 10., 0.2)
y = np.sin(x)

# Biến đường biên bên trên và bên phải -> vô hình 
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')

# Di chuyển đường bên dưới vào giữa  & ở vị trí y = 0
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))

# Di chuyển đường bên trái vào giữa & ở vị trí x = 0
ax.yaxis.set_ticks_position('left')
# ax.spines['left'].set_position(('data', 0))

# Hoặc thay ('data', 0) thành 'center'
ax.spines['left'].set_position('center')

ax.plot(x, y)
plt.show()

Hình kết quả cho đoạn code trên

 

Vẽ đồ thị kiểu điểm
Trong nhiều trường hợp, ta muốn hiển thị từng điểm thay vì đường thẳng, việc chuyển đường thẳng sang điểm chúng ta sử dụng thêm các marker trong plot().

Các marker thông dụng:

Code ví dụ

import numpy as np
import matplotlib.pyplot as plt

t = np.arange(0., 10., 0.5)

plt.plot(t, t**2, 'X')
plt.show()

Hình kết quả cho đoạn code trên

 

Cách  vẽ nối các điểm bằng đường

Một số kiểu linestyle

Code ví dụ

import numpy as np
import matplotlib.pyplot as plt

x = [1, 2, 3, 5]
y = [4, 5, 6, 7]

plt.plot(x, y, linestyle='--', marker='o', color='b')

# Một cách ngắn hơn 
plt.plot(x, y, '--bo')
plt.show()

Hình kết quả cho đoạn code trên

 

Cách vẽ một vài điểm trên đường

Code ví dụ

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 30)
y = np.sin(x)

markers_on = [0, 19, 12, 5]

plt.plot(x, y, '-gD', markevery=markers_on)
plt.show()

Hình kết quả cho đoạn code trên

 

 

Tài liệu tham khảo
[1] Matploblib User’s Guide:
https://matplotlib.org/3.1.1/users/index.html

[2] Introduction to Matplotlib — Data Visualization in Python by Ehi Aigiomawu:
https://heartbeat.fritz.ai/introduction-to-matplotlib-data-visualization-in-python-d9143287ae39

[3] Matplotlib: Những điều cần biết để tùy chỉnh Figure như ý muốn:
https://texmath.com/matplotlib-nhung-lenh-can-biet-de-tuy-chinh-figure-nhu-y-muon/

 

Bài viết chia sẻ từ bạn Nguyễn Trung Thành

AIVIETNAM cám ơn sự đóng góp của bạn.

=========================================