Cốt truyện chuỗi thời gian hoạt hình Python

Cần phát triển các sơ đồ để trực quan hóa dữ liệu cho EDA của bộ dữ liệu. Có nhiều thư viện khác nhau như seaborn, matplotlib, ggplot, v.v. tạo ra các biểu đồ tuyệt vời để trực quan hóa dữ liệu. Khi nói đến các ô động hoặc ô hoạt hình, các thư viện này không thể phát triển các ô hoạt hình. bar-chart-race là một thư viện python mã nguồn mở có thể tạo các biểu đồ động hoặc hoạt hình cho tập dữ liệu chuỗi thời gian

Cài đặt

Cài đặt Pip và Conda của thư viện bar_chart_race

pip install bar_chart_race
conda install -c conda-forge bar_chart_race

Cách sử dụng

thư viện bar_chart_race là một thư viện mã nguồn mở tạo các biểu đồ thanh động cho bộ dữ liệu chuỗi thời gian. Có một danh sách các hướng dẫn bắt đầu nhanh nhất định để làm theo trước khi thực hiện các biểu đồ thanh động

  • Mỗi hàng của tập dữ liệu phải chứa một khoảng thời gian
  • Cột ngày giờ phải được đặt lại thành chỉ mục của khung dữ liệu (tùy chọn)
  • Các cột của tập dữ liệu phải là các loại biểu đồ thanh
  • Mỗi cột phải giữ một giá trị cụ thể cho một danh mục cụ thể

Tập dữ liệu mẫu được đề cập bên dưới là một ví dụ chính xác về định dạng khung dữ liệu bắt buộc để triển khai biểu đồ thanh

(Ảnh của Tác giả), Bộ dữ liệu mẫu

Bộ dữ liệu mẫu trên là số ca mắc covid-19 của Ấn Độ cho từng bang. Các cột của tập dữ liệu đề cập đến các bang của Ấn Độ và các giá trị là số trường hợp covid-19 trong một ngày cụ thể. Chỉ mục của tập dữ liệu được đặt lại thành cột Ngày

Cú pháp hàm bar_chart_race

bcr.bar_chart_race(
df, filename=None, orientation='h', sort='desc', n_bars=None, fixed_order=False, fixed_max=False, steps_per_period=10, period_length=500, interpolate_period=False, label_bars=True, bar_size=0.95, period_label=True, period_fmt=None, period_summary_func=None, perpendicular_bar_func=None, figsize=(6, 3.5), cmap=None, title=None, title_size=None, bar_label_size=7, tick_label_size=7, shared_fontdict=None, scale='linear', writer=None, fig=None, dpi=144, bar_kwargs=None, filter_column_colors=False
)

Thực hiện chức năng cho dữ liệu và kết quả covid

Dưới đây là mã python để triển khai biểu đồ thanh động cho dữ liệu chuỗi thời gian covid. Phần còn lại, tất cả các tham số được giữ như mặc định, có thể thay đổi để thay đổi cách trình bày của cốt truyện

(GIF của tác giả), Cốt truyện thanh hoạt hình

Để đọc cách tạo bảng tổng hợp tương tác bằng PivotTable. js đọc bài viết dưới đây

Bảng Pivot tương tác trong Jupyter Notebook

Tạo bảng tổng hợp tương tác bằng PivotTable. js

hướng tới khoa học dữ liệu. com

Phần kết luận

Biểu đồ thanh động là một kỹ thuật trực quan hóa tốt hơn so với biểu đồ thanh tĩnh. Trong bài viết này, chúng ta đã thảo luận cách vẽ biểu đồ thanh động hoặc thanh động cho tập dữ liệu chuỗi thời gian

Hoạt ảnh Matplotlib cũng có thể được sử dụng để phát triển các biểu đồ thanh hoạt hình nhưng nó yêu cầu nhiều dòng mã hơn để triển khai. thư viện bar_chart_race được xây dựng trên thư viện matplotlib

Dữ liệu ngày càng trở nên mong muốn hơn trong thế giới ngày nay. Các công ty và cá nhân sử dụng nó để dự đoán giá cổ phiếu thông qua học máy, theo dõi sức khỏe của một vận động viên, nghiên cứu giá nhà ở một thành phố cụ thể… khả năng là vô tận. Mặc dù dữ liệu thô là cơ bản, nhưng câu chuyện mà nó có thể kể còn quan trọng hơn nhiều. Công việc của các kỹ sư và nhà khoa học dữ liệu là kể câu chuyện này. Hình ảnh có thể là một trong những cách tốt nhất để truyền đạt ý tưởng bằng cách sử dụng dữ liệu. Hãy nghĩ xem, bạn muốn nhìn vào các dòng và dòng dữ liệu hay một vài biểu đồ tóm tắt nó? . Mặc dù không phải lúc nào cũng cần thiết, nhưng việc thêm hoạt ảnh vào cốt truyện có thể mang lại nhiều ý nghĩa hơn cho cách kể chuyện của bạn

Đến cuối bài viết này, bạn sẽ có thể tạo lại cốt truyện ở trên VÀ sử dụng khung này để tạo hoạt ảnh đẹp mắt của riêng bạn

Ảnh của Emile Perron trên Bapt

Đối với bài viết này, tôi sẽ giả sử rằng bạn có một chút nền tảng về Python và cách thực hiện thao tác và vẽ biểu đồ dữ liệu cơ bản. Xin lưu ý rằng đây không phải là cách duy nhất để sử dụng khả năng hoạt hình của Python, vì vậy hãy chia sẻ phương pháp của bạn bên dưới nếu bạn có ý tưởng khác. Chúng ta sẽ sử dụng các đường ba chiều và các điểm phân tán để tạo quỹ đạo, nhưng các khái niệm này có thể được mở rộng sang các loại biểu đồ khác như đường hai chiều, biểu đồ thanh, biểu đồ hình tròn, đường viền, v.v.

Nhập gói

Python có rất nhiều thư viện để phân tích dữ liệu, vì vậy chúng tôi sẽ sử dụng một vài trong số đó. Hãy bắt đầu một tập lệnh mới và nhập các gói cần thiết của chúng tôi cho dự án này

# Importing Packages
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import animation
  • NumPy sẽ được sử dụng để tạo mảng số và sử dụng các hàm lượng giác (được định nghĩa là np để dễ gọi)
  • Pyplot từ Matplotlib sẽ được sử dụng để vẽ đồ họa (được định nghĩa là plt để dễ gọi)
  • Axes3D sẽ được sử dụng để tạo các trục ba chiều cho cốt truyện của chúng ta
  • hoạt ảnh từ Matplotlib sẽ được sử dụng để tạo hoạt ảnh của chúng ta bằng cách gọi liên tục một hàm mà chúng ta sẽ xác định sau này

Tạo tập dữ liệu

Trước khi chúng ta có thể nghĩ về việc vẽ bất cứ thứ gì, chúng ta cần tạo dữ liệu của mình để vẽ. Đối với phần này, tôi đã tạo một số dữ liệu vị trí bằng cách sử dụng hàm sin và một mảng thời gian chạy từ 0 đến 20 (tôi tùy ý gắn nhãn nó là giây trong hoạt ảnh)

# Time Array
t = np.linspace(0, 20, 100)

# Position Arrays
x = np.sin(np.pi/5 * t)
y = np.sin(np.pi/3 * t)
z = np.linspace(0, 100, 100)

# Setting up Data Set for Animation
dataSet = np.array([x, y, z]) # Combining our position coordinates
numDataPoints = len(t)

Tôi nghĩ rằng phần này là khá tự giải thích. Bạn có thể loay hoay với các mảng thời gian và vị trí để tạo quỹ đạo mới. Các biến dataSet và numDataPoints sẽ được sử dụng trong hàm hoạt hình của chúng tôi, mà chúng tôi sẽ xác định tiếp theo

Chức năng Hoạt hình

Để tạo hiệu ứng động cho hình của chúng ta, chúng ta sẽ sử dụng một hàm, được gọi là FuncAnimation, từ lớp hoạt ảnh đã nhập. Bạn có thể truy cập tài liệu về hai điều này tại đây. FuncAnimation yêu cầu chúng tôi tạo chức năng riêng để cập nhật các dòng, điểm, v.v. , mà chúng tôi sẽ định nghĩa là animate_func

def animate_func(num):
ax.clear() # Clears the figure to update the line, point,
# title, and axes
# Updating Trajectory Line (num+1 due to Python indexing)
ax.plot3D(dataSet[0, :num+1], dataSet[1, :num+1],
dataSet[2, :num+1], c='blue')
# Updating Point Location
ax.scatter(dataSet[0, num], dataSet[1, num], dataSet[2, num],
c='blue', marker='o')
# Adding Constant Origin
ax.plot3D(dataSet[0, 0], dataSet[1, 0], dataSet[2, 0],
c='black', marker='o')
# Setting Axes Limits
ax.set_xlim3d([-1, 1])
ax.set_ylim3d([-1, 1])
ax.set_zlim3d([0, 100])

# Adding Figure Labels
ax.set_title('Trajectory \nTime = ' + str(np.round(t[num],
decimals=2)) + ' sec')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

Chúng tôi bắt đầu bằng cách nhận thấy biến num được chuyển vào animate_func. Đây là một chỉ mục cho bước hoạt hình hiện tại. Khi chúng ta chuyển animate_func sang FuncAnimation, nó sẽ lặp lại biến num của chúng ta. Chúng tôi có thể sử dụng biến đó để lặp qua Tập dữ liệu mà chúng tôi đã tạo trước đó

Chức năng bắt đầu bằng cách xóa hình. Điều này loại bỏ các dòng, điểm, điểm gốc, nhãn trục và tiêu đề. Sau đó, nó thêm đường quỹ đạo được cập nhật (từ 0 đến num) và vị trí điểm (ở bước num). Nguồn gốc của chúng tôi không đổi trong hình này, vì vậy bạn sẽ nhận thấy rằng num không hiển thị vì chúng tôi không thay đổi nguồn gốc. Tiếp theo, chức năng xác định giới hạn trục không thay đổi của chúng tôi. Bạn có thể xóa các giới hạn trục nếu bạn muốn các trục thay đổi khi số của bạn tăng lên (làm cho các trục động)

Cuối cùng, hàm xác định tiêu đề và nhãn trục của chúng tôi. Các nhãn rất đơn giản, chỉ cần x, y và z của chúng tôi cho tọa độ Descartes. Là một chức năng bổ sung nhỏ, chúng tôi có một tiêu đề động hiển thị mảng thời gian quỹ đạo, t. Chúng tôi đang hiển thị nó (làm tròn đến chữ số thập phân thứ hai) và cập nhật nó mỗi lần lặp lại. Lưu ý, đây không phải là giây theo thời gian thực

Vẽ đồ họa hoạt hình của chúng tôi

Bước cuối cùng là vẽ sơ đồ hoạt hình của chúng ta bằng FuncAnimation. Chúng tôi bắt đầu bằng cách tạo đối tượng hình của chúng tôi với các trục ba chiều. Sau đó, chúng tôi sử dụng FuncAnimation, lấy hình, hàm hoạt ảnh được tạo trước đó, giá trị khoảng thời gian và giá trị khung làm đầu vào. Khoảng thời gian là độ trễ giữa các khung hình tính bằng mili giây và khung hình chỉ đơn giản là số lượng khung hình bạn muốn hiển thị. Hai đối số cuối cùng này là các đối số tùy chọn, nhưng tôi muốn đưa chúng vào nếu tôi muốn điều chỉnh giao diện của hoạt ảnh

# Plotting the Animation
fig = plt.figure()
ax = plt.axes(projection='3d')
line_ani = animation.FuncAnimation(fig, animate_func, interval=100,
frames=numDataPoints)
plt.show()

Bạn có thể chạy mã và nếu được thực hiện đúng, biểu đồ của bạn sẽ giống như sau (tốc độ của điểm có thể khác)

Hoạt hình quỹ đạo [Được tạo bởi tác giả]

Lưu hoạt ảnh của chúng tôi (Tùy chọn)

Nếu bạn muốn lưu hoạt ảnh của mình dưới dạng. gif, bạn có thể sử dụng đoạn mã sau để làm điều đó

# Saving the Animation
f = r"c://Users/(Insert User)/Desktop/animate_func.gif"
writergif = animation.PillowWriter(fps=numDataPoints/6)
line_ani.save(f, writer=writergif)

Bạn cần chọn một vị trí để lưu nó và lưu nó dưới dạng biến f. Bạn có thể điều chỉnh khung hình trên giây, khung hình/giây, biến trong GốiWriter. Tôi chia biến numDataPoints, được định nghĩa là số lượng khung hình trong FuncAnimation, cho 6 để có hoạt ảnh dài 6 giây

Đó là tất cả cho bài viết này. Cảm ơn bạn đã đọc. Nếu bạn không muốn bỏ lỡ nhiều bài viết về Python và kỹ thuật hơn, hãy theo dõi và đăng ký nhận email của tôi. Tôi đã viết một vài bài báo khác, vì vậy hãy kiểm tra chúng