」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何加速 Matplotlib 繪圖以提高效能?

如何加速 Matplotlib 繪圖以提高效能?

發佈於2024-11-06
瀏覽:184

How to Speed Up Matplotlib Plotting to Enhance Performance?

為什麼 Matplotlib 這麼慢?

在評估 Python 繪圖庫時,考慮效能很重要。 Matplotlib 是一個廣泛使用的函式庫,它看起來可能很緩慢,引發了關於加快速度或探索替代選項的問題。讓我們深入研究這個問題並探索可能的解決方案。

提供的範例展示了具有多個子圖和資料更新的圖。使用 Matplotlib,此過程涉及重繪所有內容,包括軸邊界和刻度標籤,導致效能降低。

了解瓶頸

導致速度緩慢的兩個關鍵因素:

  1. 過度重繪: Matplotlib 的Fig.canvas.draw() 函數重繪整個圖形,即使只有一小部分需要更新。
  2. 豐富的刻度標籤:大量的刻度標籤和子圖會給繪圖過程帶來很大的負擔。

使用 Blitting 進行最佳化

解決這些瓶頸,考慮使用位塊傳送。 Blitting 涉及僅更新圖形的特定部分,從而減少渲染時間。然而,為了高效實現,需要特定於後端的程式碼,這可能需要在 GUI 工具包中嵌入 Matplotlib 繪圖。

GUI-中性位圖傳送

A GUI-中性位圖傳送技術可以在不依賴後端的情況下提供合理的性能:

  1. 捕獲背景:在動畫之前,捕獲每個子圖的背景以便稍後恢復。
  2. 更新與繪製: 對於每一幀,更新線條的資料和藝術家,恢復背景並點陣圖更新部分。
  3. 避免重繪: 使用Fig.canvas.blit( ax.bbox) 而不是 Fig.canvas.draw() 來僅更新必要的區域。

範例實作:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)

fig, axes = plt.subplots(nrows=6)

styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'c-']
def plot(ax, style):
    return ax.plot(x, y, style, animated=True)[0]

lines = [plot(ax, style) for ax, style in zip(axes, styles)]

# Capture Background
backgrounds = [fig.canvas.copy_from_bbox(ax.bbox) for ax in axes]

for i in xrange(1, 2000):
    for j, (line, ax, background) in enumerate(zip(lines, axes, backgrounds), start=1):
        fig.canvas.restore_region(background)
        line.set_ydata(np.sin(j*x   i/10.0))
        ax.draw_artist(line)
        fig.canvas.blit(ax.bbox)

動畫模組

最新的Matplotlib 版本包含一個動畫模組,它簡化了blitting:

import matplotlib.pyplot as plt
import matplotlib.animation as animation

def animate(i):
    for j, line in enumerate(lines, start=1):
        line.set_ydata(np.sin(j*x   i/10.0))

ani = animation.FuncAnimation(fig, animate, xrange(1, 200), interval=0, blit=True)
版本聲明 本文轉載於:1729342040如有侵犯,請洽[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3