多数の切断された線分を異なる色でプロットする 質問する

多数の切断された線分を異なる色でプロットする 質問する

次のようなデータ レコード セットがあります。

(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

使用LineCollection:

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)

出力は次のとおりです。

ここに画像の説明を入力してください

おすすめ記事