Line plot là một dạng trực quan hóa dữ liệu quan hệ, cho thấy một biến liên tục thay đổi như thế nào khi biến liên tục khác thay đổi. Đây là một trong những biểu đồ phổ biến nhất, được dùng rộng rãi trong tài chính, bán hàng, marketing, chăm sóc sức khỏe, khoa học tự nhiên và nhiều lĩnh vực khác.
Trong hướng dẫn này, chúng tôi sẽ thảo luận cách sử dụng Seaborn, một thư viện trực quan hóa dữ liệu Python phổ biến, để tạo và tùy chỉnh line plot trong Python.
Giới thiệu bộ dữ liệu
Để có dữ liệu luyện tập với seaborn line plot, trước tiên chúng ta sẽ tải về bộ dữ liệu Kaggle có tên Daily Exchange Rates per Euro 1999-2024. Sau đó, chúng ta sẽ import các gói cần thiết, đọc và làm sạch dataframe. Không đi sâu vào chi tiết xử lý, đoạn mã dưới đây minh họa các bước thực hiện:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
daily_exchange_rate_df = pd.read_csv('euro-daily-hist_1999_2022.csv')
daily_exchange_rate_df = daily_exchange_rate_df.iloc[:, [0, 1, 4, -2]]
daily_exchange_rate_df.columns = ['Date', 'Australian dollar', 'Canadian dollar', 'US dollar']
daily_exchange_rate_df = pd.melt(daily_exchange_rate_df, id_vars='Date', value_vars=['Australian dollar', 'Canadian dollar', 'US dollar'], value_name='Euro rate', var_name='Currency')
daily_exchange_rate_df['Date'] = pd.to_datetime(daily_exchange_rate_df['Date'])
daily_exchange_rate_df = daily_exchange_rate_df[daily_exchange_rate_df['Date']>='2022-12-01'].reset_index(drop=True)
daily_exchange_rate_df['Euro rate'] = pd.to_numeric(daily_exchange_rate_df['Euro rate'])
print(f'Currencies: {daily_exchange_rate_df.Currency.unique()}\n')
print(df.head())
print(f'\n{daily_exchange_rate_df.Date.dt.date.min()}/{ daily_exchange_rate_df.Date.dt.date.max()}')
Đầu ra:
Currencies: ['Australian dollar' 'Canadian dollar' 'US dollar']
Date Currency Euro rate
0 2023-01-27 Australian dollar 1.5289
1 2023-01-26 Australian dollar 1.5308
2 2023-01-25 Australian dollar 1.5360
3 2023-01-24 Australian dollar 1.5470
4 2023-01-23 Australian dollar 1.5529
2022-12-01/2023-01-27
Dataframe thu được chứa tỷ giá Euro theo ngày (ngày làm việc) cho đô la Úc, đô la Canada và đô la Mỹ trong giai đoạn từ 01.12.2022 đến hết 27.01.2023.
Giờ thì chúng ta đã sẵn sàng bắt tay vào tạo và tùy chỉnh seaborn line plot trong Python.
Các yếu tố cơ bản của Seaborn Line Plot
Để tạo line plot trong Seaborn, ta có thể dùng một trong hai hàm: lineplot() hoặc relplot(). Nhìn chung, chúng có nhiều chức năng chung với nhau và dùng chung tên tham số. Khác biệt chính là relplot() cho phép tạo line plot với nhiều đường trên các facet khác nhau. Trong khi đó, lineplot() hỗ trợ làm việc với khoảng tin cậy (confidence interval) và tổng hợp dữ liệu.
Trong hướng dẫn này, chúng ta sẽ chủ yếu dùng hàm lineplot().
Khóa học Introduction to Data Visualization with Seaborn sẽ giúp bạn học và luyện các hàm, phương thức chính của thư viện seaborn. Bạn cũng có thể xem hướng dẫn Seaborn cho người mới bắt đầu để làm quen hơn với thư viện Python phổ biến này.
Tạo một seaborn line plot đơn
Ta có thể tạo line plot thể hiện mối quan hệ giữa hai biến liên tục như sau:
usd = daily_exchange_rate_df[daily_exchange_rate_df['Currency']=='US dollar'].reset_index(drop=True)
sns.lineplot(x='Date', y='Euro rate', data=usd)
Đầu ra:

Biểu đồ trên cho thấy diễn biến tỷ giá EUR-USD. Chúng ta đã xác định các biến vẽ trên trục x và y (các tham số x và y) và dataframe (data) để lấy các biến này.
Để so sánh, nếu muốn tạo biểu đồ tương tự bằng relplot(), ta viết như sau:
sns.relplot(x='Date', y='Euro rate', data=usd, kind='line')
Đầu ra:

Trong trường hợp này, chúng ta truyền thêm một đối số dành riêng cho hàm relplot(): kind='line'. Mặc định, hàm này tạo scatter plot.
Tùy chỉnh một seaborn line plot đơn
Ta có thể tùy chỉnh biểu đồ trên theo nhiều cách để dễ đọc và nhiều thông tin hơn. Ví dụ: điều chỉnh kích thước hình, thêm tiêu đề và nhãn trục, chỉnh cỡ chữ, tùy biến đường vẽ, thêm và tùy biến marker, v.v. Hãy xem cách thực hiện các cải tiến này trong seaborn.
Điều chỉnh kích thước hình
Vì Seaborn xây dựng trên matplotlib, ta có thể dùng matplotlib.pyplot để điều chỉnh kích thước hình:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd)
Đầu ra:

Với relplot(), ta có thể dùng tham số height và aspect (tỷ lệ rộng:cao) cho cùng mục đích:
sns.relplot(x='Date', y='Euro rate', data=usd, kind='line', height=6, aspect=4)
Đầu ra:

Thêm tiêu đề và nhãn trục
Để thêm tiêu đề biểu đồ và nhãn trục, ta có thể dùng hàm set() trên đối tượng seaborn line plot, truyền vào các đối số title, xlabel và ylabel:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
Đầu ra:

Điều chỉnh cỡ chữ
Một cách tiện lợi để điều chỉnh cỡ chữ là dùng hàm set_theme() và thử các giá trị khác nhau của tham số font_scale:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Lưu ý rằng chúng ta cũng thêm style='white' để tránh ghi đè style ban đầu.
Thay đổi màu, kiểu và độ dày của đường
Để tùy chỉnh đường vẽ, ta có thể truyền vào một số tham số chung với matplotlib.pyplot.plot, như color, linestyle hoặc linewidth:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd, linestyle='dotted', color='magenta', linewidth=5).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Thêm marker và tùy chỉnh màu, kiểu, kích thước
Có thể thêm marker trên đường và tùy chỉnh cách hiển thị của chúng. Khi đó, ta có thể dùng một số tham số từ matplotlib như marker, markerfacecolor hoặc markersize:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd, marker='*', markerfacecolor='limegreen', markersize=20).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Tài liệu cung cấp danh sách đầy đủ các tham số để cải thiện tính thẩm mỹ của seaborn line plot. Đặc biệt, bạn có thể xem tất cả các lựa chọn marker khả dụng.
Trong Seaborn cheat sheet của chúng tôi, bạn sẽ tìm thấy thêm các cách tùy chỉnh line plot trong Seaborn.
Seaborn Line Plot với nhiều đường
Không ít khi chúng ta cần khám phá cách nhiều biến liên tục thay đổi theo một biến liên tục khác. Với mục đích này, ta có thể dựng seaborn line plot với nhiều đường. Hai hàm lineplot() và relplot() cũng áp dụng tốt cho các trường hợp này.
Tạo seaborn line plot với nhiều đường
Về mặt kỹ thuật, có thể tạo seaborn line plot với nhiều đường chỉ bằng cách dựng một đối tượng axes riêng cho mỗi biến phụ thuộc, tức mỗi đường:
aud = daily_exchange_rate_df[daily_exchange_rate_df['Currency']=='Australian dollar'].reset_index(drop=True)
cad = daily_exchange_rate_df[daily_exchange_rate_df['Currency']=='Canadian dollar'].reset_index(drop=True)
sns.lineplot(x='Date', y='Euro rate', data=usd)
sns.lineplot(x='Date', y='Euro rate', data=aud)
sns.lineplot(x='Date', y='Euro rate', data=cad)
Đầu ra:

Ở trên, chúng ta trích xuất thêm hai tập con từ dataframe ban đầu daily_exchange_rate_df – cho đô la Úc và đô la Canada – và vẽ mỗi tỷ giá euro theo thời gian. Tuy nhiên, có những cách hiệu quả hơn: dùng các tham số hue, style hoặc size, vốn có trong cả lineplot() và relplot().
Sử dụng tham số hue
Tham số này hoạt động như sau: ta gán cho nó tên một cột trong dataframe chứa các giá trị phân loại, rồi seaborn sẽ tạo line plot cho từng hạng mục, và tô mỗi đường bằng một màu khác nhau:
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency')
Đầu ra:

Chỉ với một dòng code đơn giản, chúng ta đã tạo seaborn line plot cho ba hạng mục. Lưu ý rằng ta truyền vào dataframe ban đầu daily_exchange_rate_df thay vì các tập con theo từng loại tiền.
Sử dụng tham số style
Tham số style hoạt động tương tự hue, chỉ khác là nó phân biệt các hạng mục bằng kiểu đường (liền, gạch, chấm, v.v.), không ảnh hưởng đến màu:
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency')
Đầu ra:

Sử dụng tham số size
Tương tự hue và style, tham số size tạo một đường riêng cho mỗi hạng mục. Nó không ảnh hưởng đến màu và kiểu đường mà làm cho mỗi đường có độ dày khác nhau:
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, size='Currency')
Đầu ra:

Tùy chỉnh seaborn line plot với nhiều đường
Giờ hãy thử nghiệm phần thẩm mỹ của biểu đồ. Một số kỹ thuật giống hệt những gì ta áp dụng cho line plot đơn. Số khác chỉ áp dụng cho line plot nhiều đường.
Điều chỉnh tổng thể
Ta có thể điều chỉnh kích thước hình, thêm tiêu đề và nhãn trục, và thay đổi cỡ chữ cho biểu đồ trên giống như với line plot đơn:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency').set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Thay đổi màu, kiểu và độ dày của từng đường
Trước đó, ta đã thấy khi dùng các tham số hue, style hoặc size, seaborn cung cấp bộ màu/kiểu/độ dày mặc định cho line plot nhiều đường. Nếu cần, ta có thể ghi đè các mặc định này và tự chọn màu/kiểu/độ dày.
Khi dùng tham số hue, ta có thể truyền thêm đối số palette dưới dạng list hoặc tuple tên màu của matplotlib. Tôi khuyên bạn đọc hướng dẫn Seaborn Color Palette: Quick Guide to Picking Colors để hiểu thêm về lý thuyết màu sắc và có nhiều ý tưởng hay giúp trực quan trông đẹp mắt.
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', palette=['magenta', 'deepskyblue', 'yellowgreen']).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Ta cũng có thể áp dụng trực tiếp một bảng màu matplotlib sẵn có:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', palette='spring').set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Đồng thời, khi dùng hue, ta vẫn có thể điều chỉnh kiểu và độ dày đường cho tất cả các đường bằng cách truyền các đối số linestyle và linewidth:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', palette=['magenta', 'deepskyblue', 'yellowgreen'], linestyle='dashed', linewidth=5).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Ngược lại, khi tạo seaborn line plot nhiều đường bằng tham số style, ta có thể gán một list (hoặc tuple) các list (hoặc tuple) cho tham số dashes:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', dashes=[[4, 4], [6, 1], [3, 9]]).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Trong danh sách các list gán cho dashes ở trên, phần tử đầu tiên của mỗi list con biểu thị độ dài đoạn vẽ của đường tương ứng, còn phần tử thứ hai – độ dài khoảng trống.
Lưu ý: để biểu diễn đường liền, ta cần đặt độ dài khoảng trống bằng 0, ví dụ: [1, 0].
Để điều chỉnh màu và độ dày cho tất cả các đường của biểu đồ này, ta cung cấp các đối số color và linewidth, giống như khi tùy chỉnh seaborn line plot đơn:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', dashes=[[4, 4], [6, 1], [3, 9]], color='darkviolet', linewidth=4).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Cuối cùng, khi dùng tham số size để tạo seaborn multiple line plot, ta có thể điều chỉnh độ dày từng đường thông qua tham số sizes. Nó nhận vào một list (hoặc tuple) số nguyên:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, size='Currency', sizes=[2, 10, 5]).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Để tùy chỉnh màu và kiểu cho tất cả các đường của biểu đồ này, ta cần cung cấp các đối số linestyle và color:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, size='Currency', sizes=[2, 10, 5], linestyle='dotted', color='teal').set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Thêm marker và tùy chỉnh màu, kiểu, kích thước
Chúng ta có thể muốn thêm marker trên seaborn multiple line plot.
Để thêm marker cùng màu, kiểu và kích thước trên tất cả các đường, ta dùng các tham số từ matplotlib như marker, markerfacecolor, markersize, v.v., giống như với line plot đơn:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', marker='o', markerfacecolor='orangered', markersize=10).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Tuy nhiên, mọi thứ khác đi khi ta muốn marker khác nhau cho từng đường. Lúc này, ta cần dùng tham số markers, vốn theo chức năng của seaborn chỉ hoạt động khi tham số style được chỉ định:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', markers=['o', 'X', '*'], markerfacecolor='brown', markersize=10).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Trên biểu đồ trên, ta có thể cho tất cả các đường thành đường liền bằng cách cung cấp đối số dashes và đặt mẫu kiểu [1, 0] cho mỗi đường:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', markers=['o', 'X', '*'], dashes=[[1, 0], [1, 0], [1, 0]], markerfacecolor='brown', markersize=10).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Đầu ra:

Kết luận
Tóm lại, trong hướng dẫn này, chúng ta đã học nhiều cách để tạo và tùy chỉnh Seaborn line plot với một hoặc nhiều đường.
Tiếp theo, với seaborn, chúng ta có thể làm nhiều hơn để điều chỉnh line plot. Ví dụ, chúng ta có thể:
- Nhóm các đường theo nhiều biến phân loại
- Tùy chỉnh chú giải (legend)
- Tạo line plot với nhiều đường trên các facet khác nhau
- Hiển thị và tùy chỉnh khoảng tin cậy
- Tùy chỉnh vạch chia và nhãn trục thời gian cho line plot chuỗi thời gian
Để đào sâu hơn những gì có thể làm với seaborn và cách thực hiện, hãy cân nhắc tham gia khóa học Intermediate Data Visualization with Seaborn.
Câu hỏi thường gặp về Seaborn Line Plot
Line plot trong Seaborn là gì?
Line plot trong Seaborn là một loại biểu đồ thể hiện mối quan hệ giữa hai biến bằng cách nối các điểm dữ liệu bằng một đường thẳng.
Loại dữ liệu nào phù hợp nhất với line plot trong Seaborn?
Line plot phù hợp nhất với dữ liệu có mối quan hệ rõ ràng giữa hai biến, và các biến đó là liên tục hoặc thứ bậc.
Tôi có thể vẽ nhiều đường trên cùng một biểu đồ trong Seaborn không?
Có. Bạn có thể vẽ nhiều đường trên cùng một biểu đồ trong Seaborn bằng cách dùng tham số hue để chỉ định biến phân loại dùng để nhóm dữ liệu.
Sự khác nhau giữa line plot và scatter plot trong Seaborn là gì?
Line plot trong Seaborn thể hiện mối quan hệ giữa hai biến bằng đường thẳng nối các điểm, trong khi scatter plot thể hiện mối quan hệ bằng các điểm riêng lẻ.
Tôi có thể thêm đường hồi quy vào line plot của mình trong Seaborn không?
Có. Bạn có thể thêm đường hồi quy vào line plot trong Seaborn bằng cách dùng hàm regplot(), hàm này khớp và vẽ mô hình hồi quy tuyến tính giữa hai biến.
Làm thế nào để lưu seaborn line plot ra tệp?
Bạn có thể lưu seaborn line plot ra tệp bằng hàm savefig() của thư viện matplotlib, hàm này lưu hình hiện tại tới đường dẫn và định dạng tệp được chỉ định.