1

私は次のコードを使用して、matplotlibを使用してPythonで多数のオーバープロットされた行を含むプロットを生成しています。

def a_run(n, t, s):
    xaxis = np.arange(t, dtype=float)
    #Scale x-axis by the step size
    for i in xaxis:
        xaxis[i]=(xaxis[i]*s)
    for j in range(n):
        result = a_solve(t,s)
        plt.plot(result[:,1], color = 'r', alpha=0.1)

def b_run(n, t, s):
    xaxis = np.arange(t, dtype=float)
    #Scale x-axis by the step size
    for i in xaxis:
        xaxis[i]=(xaxis[i]*s)
    for j in range(n):
        result = b_solve(t,s)
        plt.plot(result[:,1], color = 'b', alpha=0.1)

a_run(100, 300, 0.02)
b_run(100, 300, 0.02)   

plt.xlabel("Time")
plt.ylabel("P")
plt.legend(("A","B"), shadow=True, fancybox=True) Legend providing same color for both
plt.show()

これにより、次のようなプロットが生成されます。

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

問題は凡例です。線は非常に高い透明度でプロットされているため、凡例の線も同様であり、それを読み取るのは非常に困難です。さらに、「最初の2つの」線であると私が思うものをプロットしており、1つの赤と1つの青が必要な場合は、両方とも赤です。

RグラフィックライブラリのようにMatplotlibで線の色を調整する方法がわかりませんが、確実な回避策はありますか?

4

2 に答える 2

5

多くの線をプロットする場合は、LineCollectionを使用してパフォーマンスを向上させる必要があります

import matplotlib.collections as mplcol
import matplotlib.colors as mplc

def a_run(n, t, s):
    xaxis = np.arange(t, dtype=float)
    #Scale x-axis by the step size
    for i in xaxis:
        xaxis[i]=(xaxis[i]*s)
    result = [a_solve(t,s)[:,1] for j in range(n)]
    lc = mplcol.LineCollection(result, colors=[mplc.to_rgba('r', alpha=0.1),]*n)
    plt.gca().add_collection(lc)
    return ls

[...]
lsa = a_run(...)
lsb = b_run(...)    
leg = plt.legend((lsa, lsb),("A","B"), shadow=True, fancybox=True)
#set alpha=1 in the legend
for l in leg.get_lines():
    l.set_alpha(1)
plt.draw()

私はコード自体をテストしていませんが、多くの場合、同様のことを行って大きな線のセットを描画し、プロットされた各セットごとに 1 つの線を持つ凡例を作成します。

于 2013-01-25T16:53:00.067 に答える