Hướng dẫn dùng .t python python

Matplotlib nâng cao chúng ta ít sử dụng trong trực quan dữ liệu, nhưng nó cũng rất cần thiết để có nguồn tài liệu tham khảo khi chúng ta cần, đôi lúc không có gì là thừa, chẳng qua chưa đến lúc ta dùng đến nó thôi. Hãy cùng tìm hiểu thêm nhé!

Đừng quên import thư viện matplotlib bạn nhé!

import matplotlib.pyplot as plt

Thang đo lôgarit (Logarithmic scale)

Cũng có thể đặt thang đo logarit cho một hoặc cả hai trục. Chức năng này trên thực tế chỉ là một ứng dụng của hệ thống biến đổi tổng quát hơn trong Matplotlib. Mỗi tỷ lệ của trục được đặt riêng biệt bằng cách sử dụng các phương thức set_xscale và set_yscale chấp nhận một tham số (với giá trị “log” trong trường hợp này):

fig, axes = plt.subplots(1, 2, figsize=(10,4))
      
axes[0].plot(x, x**2, x, np.exp(x))
axes[0].set_title("Normal scale")

axes[1].plot(x, x**2, x, np.exp(x))
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)");

Output:

Hướng dẫn dùng .t python python

Nhãn đánh dấu tùy chỉnh

Chúng ta có thể xác định rõ ràng vị trí chúng ta muốn đánh dấu trục bằng set_xticks và set_yticks, cả hai đều lấy danh sách các giá trị cho vị trí trên trục sẽ đặt dấu. Chúng tôi cũng có thể sử dụng các phương thức set_xticklabels và set_yticklabels để cung cấp danh sách các nhãn văn bản tùy chỉnh cho từng vị trí đánh dấu:

fig, ax = plt.subplots(figsize=(10, 4))

ax.plot(x, x**2, x, x**3, lw=2)

ax.set_xticks([1, 2, 3, 4, 5])
ax.set_xticklabels([r'$\alpha$', r'$\beta$', r'$\gamma$', r'$\delta$', r'$\epsilon$'], fontsize=18)

yticks = [0, 50, 100, 150]
ax.set_yticks(yticks)
ax.set_yticklabels(["$%.1f$" % y for y in yticks], fontsize=18); # use LaTeX formatted labels

Output:

Hướng dẫn dùng .t python python

Ký hiệu khoa học (Scientific notation)

Với các số quá lớn trên trục, tốt hơn là sử dụng cách này để set giá trị cho trục

fig, ax = plt.subplots(1, 1)
      
ax.plot(x, x**2, x, np.exp(x))
ax.set_title("scientific notation")

ax.set_yticks([0, 50, 100, 150])

from matplotlib import ticker
formatter = ticker.ScalarFormatter(useMathText=True)
formatter.set_scientific(True) 
formatter.set_powerlimits((-1,1)) 
ax.yaxis.set_major_formatter(formatter)

Output:

Hướng dẫn dùng .t python python

Số trục và khoảng cách nhãn trục

# distance between x and y axis and the numbers on the axes
matplotlib.rcParams['xtick.major.pad'] = 5
matplotlib.rcParams['ytick.major.pad'] = 5

fig, ax = plt.subplots(1, 1)
      
ax.plot(x, x**2, x, np.exp(x))
ax.set_yticks([0, 50, 100, 150])

ax.set_title("label and axis spacing")

# padding between axis label and axis numbers
ax.xaxis.labelpad = 5
ax.yaxis.labelpad = 5

ax.set_xlabel("x")
ax.set_ylabel("y");

Output:

Hướng dẫn dùng .t python python

Điều chỉnh vị trí trục

Có những lúc khi lưu số liệu, các nhãn đôi khi bị cắt bớt và có thể cần điều chỉnh vị trí của các trục một chút. Điều này có thể được thực hiện bằng cách sử dụng subplots_adjust:

fig, ax = plt.subplots(1, 1)
      
ax.plot(x, x**2, x, np.exp(x))
ax.set_yticks([0, 50, 100, 150])

ax.set_title("title")
ax.set_xlabel("x")
ax.set_ylabel("y")

fig.subplots_adjust(left=0.15, right=.9, bottom=0.1, top=0.9);

Output:

Hướng dẫn dùng .t python python

Lưới trục (Axis grid)

Với phương thức lưới (grid) trong đối tượng trục, chúng ta có thể bật và tắt các đường lưới. Chúng tôi cũng có thể tùy chỉnh sự xuất hiện của các đường lưới bằng cách sử dụng các đối số từ khóa giống như hàm plot:

fig, axes = plt.subplots(1, 2, figsize=(10,3))

# default grid appearance
axes[0].plot(x, x**2, x, x**3, lw=2)
axes[0].grid(True)

# custom grid appearance
axes[1].plot(x, x**2, x, x**3, lw=2)
axes[1].grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5)

Output:

Hướng dẫn dùng .t python python

Gai trục (Axis spines)

Chúng ta cũng có thể thay đổi các thuộc tính của gai trục:

fig, ax = plt.subplots(figsize=(6,2))

ax.spines['bottom'].set_color('blue')
ax.spines['top'].set_color('blue')

ax.spines['left'].set_color('red')
ax.spines['left'].set_linewidth(2)

# turn off axis spine to the right
ax.spines['right'].set_color("none")
ax.yaxis.tick_left() # only ticks on the left side

Output:

Hướng dẫn dùng .t python python

Trục đôi (Twin axes)

Đôi khi rất hữu ích khi có trục x hoặc y kép trong một hình; ví dụ, khi vẽ đồ thị các đường cong với các đơn vị khác nhau với nhau. Matplotlib hỗ trợ điều này với các hàm twinx và twiny:

ax1.plot(x, x**2, lw=2, color="blue")
ax1.set_ylabel(r"area $(m^2)$", fontsize=18, color="blue")
for label in ax1.get_yticklabels():
    label.set_color("blue")
    
ax2 = ax1.twinx()
ax2.plot(x, x**3, lw=2, color="red")
ax2.set_ylabel(r"volume $(m^3)$", fontsize=18, color="red")
for label in ax2.get_yticklabels():
    label.set_color("red")

Output:

Hướng dẫn dùng .t python python

Các trục trong đó x và y bằng 0

fig, ax = plt.subplots()

ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0)) # set position of x spine to x=0

ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))   # set position of y spine to y=0

xx = np.linspace(-0.75, 1., 100)
ax.plot(xx, xx**3);

Output:

Hướng dẫn dùng .t python python

Các biểu đồ 2D khác

Tạo một mảng numpy để vẽ các biểu đồ khác

fig, axes = plt.subplots(1, 2, figsize=(10,4))
      
axes[0].plot(x, x**2, x, np.exp(x))
axes[0].set_title("Normal scale")

axes[1].plot(x, x**2, x, np.exp(x))
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)");
0
fig, axes = plt.subplots(1, 2, figsize=(10,4))
      
axes[0].plot(x, x**2, x, np.exp(x))
axes[0].set_title("Normal scale")

axes[1].plot(x, x**2, x, np.exp(x))
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)");
1

Output:

Hướng dẫn dùng .t python python

Chú thích văn bản vào biểu đồ

Chú thích văn bản trong các hình matplotlib có thể được thực hiện bằng cách sử dụng chức năng văn bản. Nó hỗ trợ định dạng LaTeX giống như văn bản nhãn trục và tiêu đề:

fig, axes = plt.subplots(1, 2, figsize=(10,4))
      
axes[0].plot(x, x**2, x, np.exp(x))
axes[0].set_title("Normal scale")

axes[1].plot(x, x**2, x, np.exp(x))
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)");
2

Output:

Hướng dẫn dùng .t python python

Nhiều đồ thị trên một biểu đồ

Subplots

fig, axes = plt.subplots(1, 2, figsize=(10,4))
      
axes[0].plot(x, x**2, x, np.exp(x))
axes[0].set_title("Normal scale")

axes[1].plot(x, x**2, x, np.exp(x))
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)");
3

Output:

Hướng dẫn dùng .t python python

subplot2grid

fig, axes = plt.subplots(1, 2, figsize=(10,4))
      
axes[0].plot(x, x**2, x, np.exp(x))
axes[0].set_title("Normal scale")

axes[1].plot(x, x**2, x, np.exp(x))
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)");
4

Output:

Hướng dẫn dùng .t python python

gridspec

fig, axes = plt.subplots(1, 2, figsize=(10,4))
      
axes[0].plot(x, x**2, x, np.exp(x))
axes[0].set_title("Normal scale")

axes[1].plot(x, x**2, x, np.exp(x))
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)");
5

Output:

Hướng dẫn dùng .t python python

add_axes

Việc thêm các trục bằng add_axes theo cách thủ công rất hữu ích để thêm các phần chèn vào các hình

fig, axes = plt.subplots(1, 2, figsize=(10,4))
      
axes[0].plot(x, x**2, x, np.exp(x))
axes[0].set_title("Normal scale")

axes[1].plot(x, x**2, x, np.exp(x))
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)");
6

Output:

Hướng dẫn dùng .t python python

Colormap and contour figures

Colormap và contour figures rất hữu ích để vẽ các hàm của hai biến. Trong hầu hết các chức năng này, chúng ta sẽ sử dụng bản đồ màu để mã hóa một chiều của dữ liệu. Có một số bản đồ màu được xác định trước. Nó tương đối đơn giản để xác định các bản đồ màu tùy chỉnh. Để biết danh sách các bản đồ màu được xác định trước ta có thể tham khảo tại đây: http://www.scipy.org/Cookbook/Matplotlib/Show_colormaps

fig, axes = plt.subplots(1, 2, figsize=(10,4))
      
axes[0].plot(x, x**2, x, np.exp(x))
axes[0].set_title("Normal scale")

axes[1].plot(x, x**2, x, np.exp(x))
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)");
7
fig, axes = plt.subplots(1, 2, figsize=(10,4))
      
axes[0].plot(x, x**2, x, np.exp(x))
axes[0].set_title("Normal scale")

axes[1].plot(x, x**2, x, np.exp(x))
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)");
8

Output:

Hướng dẫn dùng .t python python

imshow

fig, axes = plt.subplots(1, 2, figsize=(10,4))
      
axes[0].plot(x, x**2, x, np.exp(x))
axes[0].set_title("Normal scale")

axes[1].plot(x, x**2, x, np.exp(x))
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)");
9

Output:

Hướng dẫn dùng .t python python

Đường bao qaunh (contour)

fig, ax = plt.subplots(figsize=(10, 4))

ax.plot(x, x**2, x, x**3, lw=2)

ax.set_xticks([1, 2, 3, 4, 5])
ax.set_xticklabels([r'$\alpha$', r'$\beta$', r'$\gamma$', r'$\delta$', r'$\epsilon$'], fontsize=18)

yticks = [0, 50, 100, 150]
ax.set_yticks(yticks)
ax.set_yticklabels(["$%.1f$" % y for y in yticks], fontsize=18); # use LaTeX formatted labels
0

Output:

Hướng dẫn dùng .t python python

3D figures

Để sử dụng đồ họa 3D trong matplotlib, trước tiên chúng ta cần tạo một thể hiện của lớp Axes3D. Các trục 3D có thể được thêm vào canvas hình matplotlib theo cách giống hệt như các trục 2D; hoặc thuận tiện hơn, bằng cách chuyển đối số từ khóa projector = ‘3d’ đến các phương thức add_axes hoặc add_subplot.