Chuyển đến nội dung chính

Hướng dẫn Trực quan hóa Dữ liệu với Bokeh: Vẽ biểu đồ từ Cấu trúc Dữ liệu

Tìm hiểu các trực quan hóa cơ bản cho nhiều cấu trúc dữ liệu khác nhau bằng Bokeh.
Đã cập nhật 5 thg 10, 2026  · 6 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Trong hướng dẫn Trực quan hóa Dữ liệu với Bokeh đầu tiên, bạn đã học cách xây dựng biểu đồ từ đầu bằng các glyph. Giờ đây, bạn có thể mở rộng khái niệm này và dựng biểu đồ từ các cấu trúc dữ liệu khác như mảng và dataframe. Trong hướng dẫn này, bạn sẽ học cách vẽ dữ liệu với mảng NumPy, dataframe trong Pandas và ColumnDataSource bằng Bokeh. ColumnDataSource là cốt lõi của Bokeh, cho phép chia sẻ dữ liệu giữa nhiều biểu đồ và tiện ích (widget).

Biểu đồ Bokeh từ mảng NumPy

Tạo biểu đồ đường từ mảng NumPy

# Import packages
import numpy as np
import random
from bokeh.io import output_file, show
from bokeh.plotting import figure

# Create an array
x_array = np.array([10,20,30,40,50,60])
y_array = np.array([50,60,70,80,90,100])

# Create a line plot
plot = figure()
plot.line(x_array, y_array)

# Output plot
show(plot)

Tạo biểu đồ phân tán từ mảng NumPy

# Import packages
import numpy as np
import random
from bokeh.io import output_file, show
from bokeh.plotting import figure

# Create arrays
x_arr = np.array([10,11,12,13,14,15,16])
y_arr = np.array([17,18,19,20,21,22,23])

# Create plot
plot = figure(title = "Scatter plot", x_axis_label = "Label name of x axis", y_axis_label ="Label name of y axis")
plot.circle(x_arr,y_arr, size = 30, alpha = 0.5)

# show plot
show(plot)

Kết quả thu được biểu đồ sau:

Tạo biểu đồ bằng Dataframe Pandas

Vẽ đường với dataframe Pandas

Dữ liệu trong ví dụ này được lấy từ Kaggle. Bộ dữ liệu chứa tất cả cổ phiếu thuộc chỉ số S&P 500 trong 5 năm đến tháng 12/2018. Tệp có bảy cột:

  • Date - ngày trong tuần ở định dạng yy-mm-dd
  • Open - giá mở cửa của cổ phiếu
  • High - giá cao nhất trong ngày
  • Low - giá thấp nhất trong ngày
  • Close - giá đóng cửa trong ngày
  • Volume - khối lượng cổ phiếu được giao dịch trong ngày
  • Name - mã cổ phiếu

Chúng ta muốn xem xu hướng cổ phiếu của Google trong giai đoạn 5 năm. Trước tiên, tải dữ liệu bằng Pandas rồi kiểm tra năm hàng đầu tiên của dataframe Pandas.

# Import packages
import pandas as pd
# Load data
df = pd.read_csv('all_stocks_5yr.csv')
df.head()
# Focus on Google's stock
df_goog = df[df['Name'] == 'GOOG']
# Convert date column to a time series
df_goog['date'] = pd.to_datetime(df_goog['date'])

plot = figure(title= "Pandas Line Plot", x_axis_type = 'datetime', x_axis_label = 'date', y_axis_label= 'Prices')
plot.line(x = df_goog['date'], y = df_goog['high'])

# Output plot
show(plot)

Trong biểu đồ, cần chuyển cột ngày sang kiểu datetime để hiển thị ngày dọc theo trục x. Ngoài ra, hàm line (glyph trong Bokeh) được dùng để tạo biểu đồ chuỗi thời gian cho giá cao nhất của Google.

Tạo biểu đồ phân tán từ dataframe Pandas

Ở phần này, chúng ta dùng dữ liệu cổ phiếu S&P 500 mã nguồn mở có sẵn trên Kaggle. Trong ví dụ này, chúng ta muốn xem mối tương quan giữa giá cổ phiếu của Google và Apple. Bạn có thể tìm hiểu thêm về tương quan tại đây.

# Import required packages
# Import packages
import pandas as pd
from bokeh.io import output_file, show
from bokeh.plotting import figure

# Load data
df = pd.read_csv('all_stocks_5yr.csv')

# Select Google and Apple stock
df_goog = df[df['Name'] == 'GOOG']
df_apple = df[df['Name'] == 'AAPL']

# Select only 'date' and 'high' columns for Google and Apple
df_goog = df_goog[['date','high']]
df_apple = df_apple[['date','high']]
# Rename 'high' column to 'high_goog' and 'high_apple'
df_goog.rename(columns={'high': 'high_goog'}, inplace=True)
df_apple.rename(columns={'high': 'high_apple'}, inplace=True)

df_merged = pd.merge(df_goog, df_apple, how='inner', on='date')
# See the first five rows
df_merged.head(5)

Việc gộp dữ liệu đảm bảo giá theo ngày tương ứng với nhau dựa trên ngày tháng. Điều này giúp giảm vấn đề tương quan giữa các mức giá ở những ngày khác nhau, vốn sẽ dẫn đến suy luận thống kê sai.

# Create scatter plot
plot = figure(title= "Pandas Scatter Plot", x_axis_label = "Apple high prices", y_axis_label= "Google high prices")
plot.circle(x = df_merged['high_apple'], y = df_merged['high_goog'],color = 'red', size = 10, alpha = 0.8)

# Output the plot
show(plot)

Các vòng tròn biểu thị mối liên hệ giữa giá cao nhất của Apple và Google. Nhìn chung có tương quan dương giữa giá cổ phiếu của Google và Apple.

Tạo biểu đồ Bokeh từ ColumnDataSource

Mục đích của ColumnDataSource là cho phép bạn tạo các biểu đồ khác nhau từ cùng một dữ liệu. Nói ngắn gọn, nó cho phép bạn xây dựng một nền tảng dữ liệu để gọi trong nhiều biểu đồ và phân tích. Điều này giúp tiết kiệm thời gian vì bạn không phải tải dữ liệu nhiều lần trong Jupyter Notebook.

ColumnDataSource tương tự như một dictionary trong Python, trong đó giá trị dữ liệu của một cột có tên khóa dạng chuỗi cho chính cột đó.

Tạo biểu đồ đường bằng ColumnDataSource

# Import packages
from bokeh.io import output_file, show
from bokeh.plotting import figure, ColumnDataSource

# Create the ColumnDataSource object
df_goog['date'] = pd.to_datetime(df_goog['date'])
data = ColumnDataSource(df_goog)

# Create time series plot
plot = figure(x_axis_type='datetime',
              title='GOOG high prices ts plot',
             x_axis_label = "Date",
              y_axis_label = "Prices in $")
plot.line(x='date', y = 'high_goog', source = data, color = 'green')
show(plot)

Biểu đồ cho thấy giá cao nhất của Google thay đổi như thế nào trong giai đoạn 5 năm, với đường biểu diễn từng điểm giá của cổ phiếu.

Để tạo biểu đồ này, chúng ta truyền toàn bộ dataframe cổ phiếu Google vào hàm ColumnDataSource và lưu dưới biến data.

Sau đó, dùng đối số source để truyền dữ liệu này vào hàm vẽ. Nhờ vậy có thể dùng trực tiếp tên cột khi tạo biểu đồ thay vì phải gọi dataframe lặp đi lặp lại.

Cuối cùng, chúng ta dùng hàm line để tạo đường màu xanh lá biểu diễn các điểm dữ liệu.

Tạo biểu đồ phân tán bằng ColumnDataSource

Trong đoạn mã này, chúng ta truyền toàn bộ dataframe cổ phiếu Google vào ColumnDataSource (như ví dụ biểu đồ đường). Dataframe được lưu trong ColumnDataSource dưới biến data. Trước tiên, chúng ta tạo biểu đồ đường bằng cách gọi trực tiếp tên cột. Cuối cùng, dùng hàm diamond để tạo các hình thoi màu đỏ biểu diễn từng điểm dữ liệu.

# Import packages
from bokeh.io import output_file, show
from bokeh.plotting import figure, ColumnDataSource

# Create the ColumnDataSource object
df_goog['date'] = pd.to_datetime(df_goog['date'])
data = ColumnDataSource(df_goog)

# Create time series plot
plot = figure(x_axis_type='datetime',
              title='GOOG high prices ts plot',
             x_axis_label = "Date",
              y_axis_label = "Prices in $")
plot.line(x='date', y = 'high_goog', source = data, color = 'green')
plot.diamond(x='date', y = 'high_goog', source = data, color = 'red')
show(plot)

Biểu đồ cho thấy diễn biến cổ phiếu của Google trong 5 năm, với các hình thoi màu đỏ biểu thị từng điểm giá của cổ phiếu.

Kết luận

Hướng dẫn này giới thiệu những cấu trúc dữ liệu phổ biến nhất mà bạn có thể gặp trong Python và cách sử dụng chúng để làm dữ liệu trở nên trực quan. Dù Bokeh không phải lựa chọn duy nhất để trực quan hóa trong Python, nó khác biệt so với Matplotlib hay Seaborn nhờ dễ sử dụng và khả năng tương tác. Ở hướng dẫn tiếp theo, bạn sẽ thực hành sử dụng bố cục (layout) để tạo các trực quan hóa hiệu quả và có tính tương tác. Nếu bạn muốn đào sâu vào mọi khả năng trực quan hóa dữ liệu mà Bokeh cung cấp, hãy xem khóa học Interactive Data Visualization with Bokeh của DataCamp.

Chủ đề
Trực quan hóa Dữ liệu
Kỹ thuật Dữ liệu
Phân tích dữ liệu
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm