ない "より良い方法は、" 何を参照するか確認してください。より高速に描画できるコードの少ないソリューションは、LineCollectionとカラーマップの併用です。
カラーマップは2色で定義でき、その間の色は自動的に補間されます。
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", [(1, 0, 0), (0, 0, 1)])
LineCollectionを使用すると、多数の行を同時にプロットすることができます。 ScalarMappableであるため、カラーマップを使用して、各行をある配列に従って色分けすることができます。この場合、その目的のためにx値を使用することができます。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.colors import LinearSegmentedColormap
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
cmap = LinearSegmentedColormap.from_list("", [(1, 0, 0), (0, 0, 1)])
points = np.array([x, y]).T.reshape(-1,1,2)
segments = np.concatenate([points[:-1],points[1:]], axis=1)
lc = LineCollection(segments, cmap=cmap, linewidth=10)
lc.set_array(x)
plt.gca().add_collection(lc)
plt.gca().autoscale()
plt.show()
画像で見ることができるように、この解決策の欠点は、個々の線がうまく接続されていないことです。
そこでこれを回避するために、一つの色を直線二つの与えられた色の間で補間される上記において
segments = np.concatenate([points[:-2],points[1:-1], points[2:]], axis=1)
を使用して、重複これらの点をプロットしてもよいです。したがって、プロットは、いくつかのカスタム補間を使用して質問からのものと異なって見えます。
問題になっていると同じ色を得るために、あなたはLineCollectionのためのカラーマップで使用する色を作成するために、同じ機能を使用することができます。この機能を単純化することを目的としている場合は、チャネルの色差の平方根として値を直接計算することができます。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.colors import LinearSegmentedColormap
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
def colorlist2(c1, c2, num):
l = np.linspace(0,1,num)
a = np.abs(np.array(c1)-np.array(c2))
m = np.min([c1,c2], axis=0)
s = np.sign(np.array(c2)-np.array(c1)).astype(int)
s[s==0] =1
r = np.sqrt(np.c_[(l*a[0]+m[0])[::s[0]],(l*a[1]+m[1])[::s[1]],(l*a[2]+m[2])[::s[2]]])
return r
cmap = LinearSegmentedColormap.from_list("", colorlist2((1, 0, 0), (0, 0, 1),100))
points = np.array([x, y]).T.reshape(-1,1,2)
segments = np.concatenate([points[:-2],points[1:-1], points[2:]], axis=1)
lc = LineCollection(segments, cmap=cmap, linewidth=10)
lc.set_array(x)
plt.gca().add_collection(lc)
plt.gca().autoscale()
plt.show()