Matplotlib: построение множества разрозненных отрезков с разными цветами
У меня есть набор записей данных, как это:
(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 с альфа-каналом).