У меня есть набор записей данных, таких как:
(s1, t1), (u1, v1), color1
(s2, t2), (u2, v2), color2
.
.
.
(sN, tN), (uN, vN), colorN
В любой записи первые два значения представляют собой конечные точки сегмента линии, третье значение - цвет этого сегмента линии. В частности, (sn, tn)
- это координаты x-y первой конечной точки, (un, vn)
- координаты x-y второго конца. Кроме того, цвет представляет собой 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()
Мне удалось ускорить рендеринг сюжета с помощью трюка Нет, как показано ниже:
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 с альфа-каналом).