更快地绘制多个图表 - Python

3

我有大约50000列数据需要在同一张图中绘制。这是我使用的代码:

# "Xaxis" is a list containing the x-axis, and "data" a list of the 50 000 data series I want to plot.
for elt in data:
    plt.plot(Xaxis,elt)

这需要一些时间(我需要等待约15分钟)。有什么建议可以优化此过程/缩短时间吗?

谢谢!

1个回答

5
一句话答案:使用LineCollection

有几种选项可以绘制多条线。

A. 循环

可以通过循环遍历数据并为每条线创建一个plot

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection


def loop(N, show=False):
    x = np.random.rand(N,3)
    y = np.random.rand(N,3)
    
    fig, ax = plt.subplots()
    for i in range(N):
        ax.plot(x[i], y[i])
        
    if show:
        plt.show()
    else:
        fig.canvas.draw()
    plt.close(fig)

B. 绘制矩阵

不必多次调用plot函数,可以将矩阵提供给plot函数,其中每一列都包含一条线路的值。但是这仍然会创建与矩阵中列数相同数量的Line2D对象。

def matrix(N, show=False):
    x = np.random.rand(N,3)
    y = np.random.rand(N,3)
    
    fig, ax = plt.subplots()

    ax.plot(x.T, y.T)
        
    if show:
        plt.show()
    else:
        fig.canvas.draw()
    plt.close(fig)

C. LineCollection线集合

LineCollection是一种集合类型,它可以创建一个单一的艺术家,只需渲染一次即可。这是最快的选项。

from matplotlib.collections import LineCollection
    
def linecoll(N, show=False):
    x = np.random.rand(N,3)
    y = np.random.rand(N,3)
    
    data = np.stack((x,y), axis=2)
    fig, ax = plt.subplots()

    ax.add_collection(LineCollection(data))
        
    if show:
        plt.show()
    else:
        fig.canvas.draw()
    plt.close(fig)

D.带有nan值的单个图。

在数据中的nan值位置将拦截一条线。这允许绘制单个Line2D,但是每个数据块结尾处会有nan,组成一个单独的线。

def fillednan(N, show=False):
    x = np.random.rand(N,3)
    y = np.random.rand(N,3)
    
    X = np.concatenate((x, np.ones_like(x)*np.nan)).flatten()
    Y = np.concatenate((y, np.ones_like(x)*np.nan)).flatten()
    
    fig, ax = plt.subplots()

    ax.plot(X,Y)
        
    if show:
        plt.show()
    else:
        fig.canvas.draw()
    plt.close(fig)

结果。

通过对不同的N值运行这些函数,并通过%timeit获得以下图表。

enter image description here

我们可以看到,LineCollection所需的时间最短。对于大的N,差异是显著的。循环是最低效的,其次是矩阵。这是因为两者都创建了需要绘制的N个单独的线条。带有NaN和LineCollection的单条线路更加高效,其中LineCollection仍然击败了plot


“intercepted” 你是指 “interrupted” 吗? - P2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接