Vẽ Biểu Đồ Với Thư Viện Matplotlib (Phần 2)

Vẽ Biểu Đồ Với Thư Viện Matplotlib (Phần 2)

Chào các bạn, để tiếp tục series về Matplotlib hôm nay mình sẽ hướng dẫn các bạn những kỹ năng nâng cao hơn để trực quan hóa dữ liệu.

Trong phần 1 mình đã giới thiệu với các bạn những kỹ năng cơ bản nhất để làm việc với thư viện Matplotlib, các bạn đã có thể vẽ những biểu đồ đơn giản và biết cách vẽ nhiều đối tượng trong một biểu đồ hay vẽ nhiều biểu đồ cạnh nhau. Trong bài này, mình sẽ giúp các bạn nắm được các kỹ năng nâng cao hơn. Hãy bắt đầu học ngay sau đây nhé :D

Nội dung bài viết:

  1. Custom trục x và y
  2. Các tham số mặc định rcParams và Styles.
  3. Custom khung chú thích
  4. Chú thích trực tiếp trong hình bằng text 
  5. Vẽ biểu đồ bên trong biểu đồ
  6. Vẽ các điểm dữ liệu với kích thước và màu sắc khác nhau
  7. Vẽ một trục x với hai trục y ở hai bên 
  8. Một số dạng biểu đồ
  9. Tạm kết 

Để bắt đầu, giống như ở phần 1 mình đã nói, các bạn sử dụng pip install matplotlib để cài đặt thư viện và sử dụng from import matplotlib.pyplot as plt để import module pyplot của matplotlib. Ngoài ra những ví dụ mình đưa ra trong phần này sẽ cần sử dụng đến thư viện numpy, vậy nên các bạn cần import cả thư viện numpy vô nhé

import numpy as np

import matplotlib as mpl 

import matplotlib.pyplot as plt

1. Điều chỉnh view trục x và y

Ở phần 1 mình đã hướng dẫn các bạn sử dụng phương thức plt.xlabel() hay plt.ylabel() để đặt tên cho trục x hay trục y. 

Trong phần này mình sẽ hướng dẫn các bạn nhiều tùy chỉnh khác nhau trên các trục này, sử dụng phương thức plt.xticks() để thực hiện thay đổi trục x và plt.yticks() để thực hiện những thay đổi trên trục y.

Xét ví dụ sau: 

Như đã nói tới ở phần 1, ta sử dụng plt.figure() để đặt lại kích thước, độ phân giải của biểu đồ và sử dụng plt.plot() để vẽ lên biểu đồ.

Phương thức xticks() yticks() là tương tự nhau nên mình chỉ hướng dẫn xticks() như là một ví dụ.

Các tham sốPhương thức này có 2 tham số chính là tickslabel

- ticks : tham số này truyền vào một list các giá trị, các giá trị này chính là các điểm được ghi số trên trục x - hay gọi tắt là number label. 

Trong ví dụ trên, với  1 radian = 57.2985 độ. như vậy ta sẽ được list các giá trị tương ứng bằng [0.0, 1.57, 3.14, 4.71, 6.28] , hay nó cũng bằng với [0, pi/2, pi, 3*pi/2, 2*pi]

- label : tham số này là list các nhãn mà bạn muốn đặt thay cho giá trị của ticks ở trên, nếu không có nhãn mặc định là các giá trị của ticks

Ngoài ra, các tham số khác có thể thêm vào là các tham số của đối tượng Text mà bạn có thể thêm vào như:

- fontsize : tham số này là kích thước font của number label

- rotation : góc lệch của text so với trục thẳng đứng (trục y)

Chuyển radian sang độ: Sử dụng FuncFormatter để thêm vào một hàm tự định nghĩa để chuyển radian sang độ.

Phương thức plt.gca() trả về đối tượng Axes hiện tại, tức là biểu đồ hiện tại.

Để vẽ lưới hiển thị dưới nền, sử dụng phương thức  plt.grid() 

Và dưới đây là kết quả :

2. Các tham số mặc định rcParams và Styles.

Để kiểm tra các tham số mặc định ta sử dụng phương thức mpl.rc_params()

Muốn thay đổi các tham số ta sử dụng phương thức update(), chẳng hạn:

mpl.rcParams.update({'font.size': 18, 'font.family': 'STIXGeneral', 'mathtext.fontset': 'stix'})

Để kiểm tra các style có sẵn ta sử dụng plt.style.available

Thay đổi style bằng phương thức plt.style.use(style_name).

Dưới đây là ví dụ về các style khác nhau:

- seaborn-notebook :

- dark_background :

Còn rất nhiều style khác nhau, các bạn có thể check để cảm thấy "cool ngầu" hơn :D

3. Điều chỉnh chú thích (legend)

Ở phần 1 mình đã giới thiệu về phương thức plt.legend() giúp các bạn chú thích những thành phần được vẽ trong biểu đồ. Hôm nay, mình sẽ hướng dẫn các bạn custom khung chú thích này. 


Như ở ví dụ trong phần 1, nếu bạn truyền vào title, mặc định legend sẽ tìm các đối tượng được vẽ và chú thích label của chúng. Nếu bạn không muốn chú thích toàn bộ hãy chỉ đưa vào những đối tượng mà bạn muốn chú thích, như trong ví dụ trên là sine, cosine, sine_2 và cosine_2 và list các label tương ứng của chúng là ['sine curve', 'cosine curve', 'sine curve 2', 'cosine curve 2']. 

Ngoài ra các tham số khác như:

- framealpha : Độ trong suốt của khung chú thích, có thể kiểm tra giá trị này bằng mpl.rcParams["legend.framealpha"]

- loc : Vị trí của khung chú thích trong biểu đồ, các giá trị như 'best', 'center', 'left center', 'right center', 'lower center', 'lower left', ...

- ncol : số cột (trong ví dụ chú thích thành 2 cột)

- shadow : True hay False. Viền có đổ bóng hay không 

- title : Title của khung chú thích 

- borderpad : Khoảng cách từ chú thích đến viền

Và đây là kết quả của ví dụ trên: 

4. Chú thích trực tiếp trong hình

Việc thêm những dòng chữ chú thích vào trực tiếp trong hình sẽ giúp biểu đồ của bạn trở nên rõ ràng và dễ hiểu hơn. Bạn có thể làm được với plt.text() 

Hai tham số chính là tọa độ và nội dung đoạn text, ngoài ra bạn có thể thêm vào các tham số như màu sắc hay căn lề. 

Xem ví dụ sau:

Trong ví dụ, ta sử dụng vòng lặp for để xác định vị trí và nội dung của đoạn text mà ta muốn vẽ lên biểu đồ.

Kết quả như sau 

5. Vẽ biểu đồ bên trong biểu đồ

Sử dụng phương thức add_axes() của đối tượng Figure .

Đầu tiên ta tạo một figure và một Axes sử dụng plt.subplots().

Sau đó, bạn có thể vẽ một biểu đồ nhỏ trong biểu đồ này như trong ví dụ dưới đây 

Kết quả của ví dụ này như sau 

Bạn sẽ cảm thấy rất thích thú nếu như biểu đồ của bạn có mật độ quá dày, mọi thứ san sát nhau và bạn muốn phóng to một phần nào đó. 

6. Vẽ các điểm dữ liệu với kích thước và màu sắc khác nhau

Ta sẽ sử dụng phương thức plt.scatter(). Một vài tham số được sử dụng như:

- x, y : list các tọa độ x và y của điểm dữ liệu (hoặc nếu bạn có một mảng dữ liệu hãy truyền nó qua tham số data như ví dụ bên dưới)

- s : kích thước của điểm dữ liệu

- c : màu của điểm dữ liệu, được sử dụng khi 

- edgecolors: màu viền của điểm dữ liệu 

Ví dụ :

Ở ví dụ này ta sử dụng thêm phương thức plt.colorbar() để có được thanh bên phải trong kết quả, chú thích mức độ màu sắc.

7. Vẽ một trục x và hai trục y ở hai bên 

Để làm được điều này ta sử dụng phương thức twinx() để tạo ra 1 đối tượng Axes chia sẻ chung trục tọa độ x. Lúc này, Axes được tạo ra có trục y ở vị trí đối lập. 

Hãy cùng xem ví dụ để dễ hiểu hơn

Kết quả được thực thi như sau

8. Histograms, Boxplots và Time Series

Ở phần này mình sẽ trình bày một số kiểu vẽ biểu đồ.

Chúng ta sẽ làm quen với subplot2grid, tương tự như subplot nhưng biểu đồ được tạo trên nền lưới sẽ giúp cho việc vẽ các cột hay đường. 

Dưới đây là các dạng biểu đồ có thể vẽ với Matplotlib:

  • Bar Chart 

  • Fill Between 

  • Time Series

  • Histogram

Tạm kết 

Như vậy, ở phần 2 mình muốn nói rất nhiều thứ nên bài viết cũng khá dài. Tuy nhiên Matplotlib còn rất nhiều thứ để học, không chỉ một hai bài viết là có thể cover được hết. Do vậy, mình hy vọng với series ngắn chỉ có 2 phần này cũng giúp các bạn phần nào thấy dễ dàng hơn với việc vẽ biểu đồ sử dụng Matplotlib. Nếu có góp ý nào về bài viết hay điều gì cần được giải đáp, hãy viết comment của bạn bên dưới nhé. Mình hy vọng bài viết đã có ích với bạn và rất cảm ơn bạn đã đọc đến cuối bài viết. Bạn xem hết bài viết đã là một sự động viên cho công sức cả ngày trời mình ngồi viết bài rồi :D.

Chúc các bạn học tốt!