我有这样一组数据记录:Matplotlib:绘制众多断开线段具有不同颜色
(s1, t1), (u1, v1), color1
(s2, t2), (u2, v2), color2
.
.
.
(sN, tN), (uN, vN), colorN
在任何记录中,前两个值是端点的线段的,第三个值是该线段的颜色。更具体地说,(sn, tn)
是第一端点的x-y坐标,(un, vn)
是第二端点的x-y坐标。另外,颜色是一个具有alpha值的rgb。
一般来说,任意两条线段都是断开(意思是它们的终点不一定重合)。
如何使用一个单一的plot
调用(或尽可能少)密谋用matplotlib这个数据可能存在潜在的几千条记录。
尝试
在一个大名单准备数据和呼叫plot
反对它是太缓慢。例如,下面的代码无法在合理的时间内完成量:
import numpy as np
import matplotlib.pyplot as plt
data = []
for _ in xrange(60000):
data.append((np.random.rand(), np.random.rand()))
data.append((np.random.rand(), np.random.rand()))
data.append('r')
print 'now plotting...' # from now on, takes too long
plt.plot(*data)
print 'done'
#plt.show()
我能够通过使用无插入技巧来加速情节渲染如下:
import numpy as np
import matplotlib.pyplot as plt
from timeit import timeit
N = 60000
_s = np.random.rand(N)
_t = np.random.rand(N)
_u = np.random.rand(N)
_v = np.random.rand(N)
x = []
y = []
for s, t, u, v in zip(_s, _t, _u, _v):
x.append(s)
x.append(u)
x.append(None)
y.append(t)
y.append(v)
y.append(None)
print timeit(lambda:plt.plot(x, y), number=1)
这会在我的机器上执行一秒钟。我仍然需要弄清楚如何嵌入颜色值(带alpha通道的RGB)。
不使用'nan'代替'None'没有任何区别,它会产生相同的情节,但我可以使用'numpy.tile'和'numpy.repeat'来构建'x'和'y' inste附加到列表的广告。你是否也想过如果你可以用这个嵌入颜色(不像'LineColelction'方法)? – dashesy