我有一组这样的数据记录:
(s1, t1), (u1, v1), color1 (s2, t2), (u2, v2), color2 . . . (sN, tN), (uN, vN), colorN
在任何记录中,前两个值是线段的 端点 ,第三个值是该线段的 颜色 。更具体地,(sn, tn)是第一端点(un, vn)的xy坐标,是第二端点的xy坐标。另外, 颜色 是具有alpha值的rgb。
(sn, tn)
(un, vn)
通常,任何两个线段都是 断开连接的 (这意味着它们的端点不一定重合)。
如何通过一次调用(或尽可能少)使用 matplotlib 绘制此数据plot,因为可能有成千上万条记录。
plot
在一个大列表中准备数据并对其进行调用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()
我可以通过使用 None 插入技巧来加速绘图渲染,如下所示:
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)。
好的,我最终将PIL图像上的行光栅化,然后将其转换为numpy数组:
from PIL import Image from PIL import ImageDraw import random as rnd import numpy as np import matplotlib.pyplot as plt N = 60000 s = (500, 500) im = Image.new('RGBA', s, (255,255,255,255)) draw = ImageDraw.Draw(im) for i in range(N): x1 = rnd.random() * s[0] y1 = rnd.random() * s[1] x2 = rnd.random() * s[0] y2 = rnd.random() * s[1] alpha = rnd.random() color = (int(rnd.random() * 256), int(rnd.random() * 256), int(rnd.random() * 256), int(alpha * 256)) draw.line(((x1,y1),(x2,y2)), fill=color, width=1) plt.imshow(np.asarray(im), origin='lower') plt.show()
这是迄今为止最快的解决方案,非常适合我的实时需求。需要注意的是,绘制线条时没有抗锯齿。