我有一组这样的数据记录:
(s1, t1), (u1, v1), color1
(s2, t2), (u2, v2), color2
.
.
.
(sN, tN), (uN, vN), colorN
在任何记录中,前两个值是线段的end-points,第三个值是该线段的color。更具体地说,(sn, tn)
是第一个端点的x-y坐标,(un, vn)
是第二个端点的x-y坐标。此外,color是带有alpha值的rgb。
一般来说,任何两条线段都是断开的(这意味着它们的端点不一定重合)。
如何使用matplotlib通过单个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)
这在我的机器上执行不到一秒钟。我仍然要弄清楚如何嵌入颜色值(RGB与阿尔法通道)。
4条答案
按热度按时间gcmastyq1#
使用
LineCollection
:下面是输出:
sulc1iza2#
函数
plot
允许在一次调用中绘制多条线,如果你的数据只是在列表中,只要在传递给plot
时解包即可:zfycwa2u3#
好吧,我最终在将PIL图像转换为numpy数组之前对PIL图像上的线条进行了光栅化:
这是目前为止最快的解决方案,它完全符合我的实时需求。
1aaf6o9v4#
我已经尝试了Python 3上可用的一些2D渲染引擎,同时在面向图像的深度学习和GAN中寻找输出阶段的快速解决方案。
使用以下基准:将99行渲染成256 x256离屏图像(或任何更有效的图像)的时间(有和没有抗锯齿)。
结果,在我的旧x301笔记本电脑的效率顺序:
基线是一个循环,它花费约0.1 ms(10,000 FPS)检索随机数并调用原语。
PyGtk 2的基本代码:
下面是PyQt 5的例子:
下面是Python3-Cairo的完整性: