次のようなデータ レコード セットがあります。
(s1, t1), (u1, v1), color1
(s2, t2), (u2, v2), color2
.
.
.
(sN, tN), (uN, vN), colorN
どのレコードでも、最初の2つの値はエンドポイント線分の3番目の値は色その線分の。より具体的には、(sn, tn)
最初の端点のxy座標は、(un, vn)
2番目の端点のxy座標です。また、色アルファ値を持つ RGB です。
一般に、任意の2つの線分は切断された(つまり、それらのエンドポイントは必ずしも一致しません)。
このデータをプロットする方法マットプロットplot
レコードが数千件になる可能性もあるため、1 回の呼び出し (または可能な限り少ない呼び出し)で処理します。
試み
データを 1 つの大きなリストに準備し、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)
これは私のマシンでは 1 秒未満で実行されます。色の値 (アルファ チャネル付き RGB) を埋め込む方法をまだ理解する必要があります。
ベストアンサー1
import numpy as np
import pylab as pl
from matplotlib import collections as mc
lines = [[(0, 1), (1, 1)], [(2, 3), (3, 3)], [(1, 2), (1, 3)]]
c = np.array([(1, 0, 0, 1), (0, 1, 0, 1), (0, 0, 1, 1)])
lc = mc.LineCollection(lines, colors=c, linewidths=2)
fig, ax = pl.subplots()
ax.add_collection(lc)
ax.autoscale()
ax.margins(0.1)
出力は次のとおりです。