我有大约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分钟)。有什么建议可以优化此过程/缩短时间吗?
谢谢!
我有大约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分钟)。有什么建议可以优化此过程/缩短时间吗?
谢谢!
LineCollection
。
有几种选项可以绘制多条线。
可以通过循环遍历数据并为每条线创建一个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)
不必多次调用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)
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)
在数据中的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
获得以下图表。
我们可以看到,LineCollection
所需的时间最短。对于大的N
,差异是显著的。循环是最低效的,其次是矩阵。这是因为两者都创建了需要绘制的N
个单独的线条。带有NaN和LineCollection
的单条线路更加高效,其中LineCollection
仍然击败了plot
。