51518


pythonを用いて、plotの線の色を変更したいです。  
一般的な、「赤」「青」などの一色の線に変更するやり方はわかりますが、  
線の途中である値に対して、線が赤になったり青になったりすることは可能でしょうか?

以下に自作したscriptを示して、具体的になにを行いたいかを示します。

[code]

    from pylab import *
    import random
    import numpy as np
    %matplotlib inline
    import matplotlib.pyplot as plt
    
    movements = np.arange(200)
    
    ##Storage information
    traceXs, traceYs = [], [];
    Speeds = [];
    Times = [];
    
    for trial in range(0, 1):
        ###moment information
        cur_x, cur_y = 0, 0;
        nxt_x, nxt_y = 0, 0;
        s = 100.0;
    
        traceXs.append(cur_x);
        traceYs.append(cur_y);
        Times.append(0);
        Speeds.append(s);
    
        for t in movements:
            """
                Section for trace movements
            """
            ###trace position of movement
            r = random.randint(0, 3)
            if r == 0:
                nxt_x, nxt_y = cur_x+1, cur_y;
            elif r == 1:
                nxt_x, nxt_y = cur_x, cur_y+1;
            elif r == 2:
                nxt_x, nxt_y = cur_x, cur_y-1;
            elif r == 3:
                nxt_x, nxt_y = cur_x-1, cur_y;
    
            traceXs.append(nxt_x);
            traceYs.append(nxt_y);
    
            #update the position for next step
            cur_x, cur_y = nxt_x, nxt_y;
    
    
            """
                Section for trace movements
            """
            direction = random.randint(0, 1)
            r2 = random.random();
            if direction == 0:
                s += r2;
            elif direction == 1:
                s -= r2;
            Times.append(t);
            Speeds.append(s);
    
    
    plt.figure()
    plt.plot(traceXs, traceYs)
    
    plt.figure()
    plt.scatter(Times, Speeds, s=1, c=Speeds, cmap='bwr')
    
    plt.figure()
    plt.scatter(traceXs, traceYs, s=1, c=Speeds, cmap='bwr')
    plt.colorbar()
    
    x_range = 1.1*max(abs(min(traceXs)), max(traceXs));
    y_range = 1.1*max(abs(min(traceYs)), max(traceYs));
    range_ = max(x_range, y_range)
    
    plt.xlim(-range_, range_)
    plt.ylim(-range_, range_)
    
    plt.show()
    
[/code]

上記のscriptはrandom walkをトレースする図（図１）を作成します。  
この図１にスピードの変化を表す色をつけたいです。(実際にはrandom walkは一定のスピードで進むのは分かっています。)

図2では移動スピードを別に計算して、それを作図したものを示します。（色はスピードの早さにより変わるようになっています。）

図2で示した色を、図１でも表示したいのですが、作成方法がわかりません。

自分で行えたのは、図３で示したようにscatter plotを使用して、それっぽくは表示してありますが、やはり線でつながれた状態で、色をつけたいです。

もしご存知の方がおられましたら、ご教授をお願いします。


CC BY-SA 4.0
2018-12-25T18:06:38.600
51512
2018-12-26T04:39:57.040
2018-12-26T03:07:17.107
29826
11048
question
python matplotlib
matplotlibでplotの線の色を変更する方法


スピードの変化に基づいて線の色を変える方法ですが、[こちら](https://matplotlib.org/examples/pylab_examples/multicolored_line.html)
が参考になるかと思います。  
で、上記を参考に質問に挙げられたコードを修正すると

[code]

    import random
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.collections import LineCollection
    
    movements = np.arange(200)
    
    ##Storage information
    traceXs, traceYs = [], [];
    Speeds = [];
    Times = [];
    
    for trial in range(0, 1):
        ###moment information
        cur_x, cur_y = 0, 0;
        nxt_x, nxt_y = 0, 0;
        s = 100.0;
    
        traceXs.append(cur_x);
        traceYs.append(cur_y);
        Times.append(0);
        Speeds.append(s);
    
        for t in movements:
            """
                Section for trace movements
            """
            ###trace position of movement
            r = random.randint(0, 3)
            if r == 0:
                nxt_x, nxt_y = cur_x+1, cur_y;
            elif r == 1:
                nxt_x, nxt_y = cur_x, cur_y+1;
            elif r == 2:
                nxt_x, nxt_y = cur_x, cur_y-1;
            elif r == 3:
                nxt_x, nxt_y = cur_x-1, cur_y;
    
            traceXs.append(nxt_x);
            traceYs.append(nxt_y);
    
            #update the position for next step
            cur_x, cur_y = nxt_x, nxt_y;
    
    
            """
                Section for trace movements
            """
            direction = random.randint(0, 1)
            r2 = random.random();
            if direction == 0:
                s += r2;
            elif direction == 1:
                s -= r2;
            Times.append(t);
            Speeds.append(s);
    
    points = np.array([traceXs, traceYs]).T.reshape(-1,1,2)
    segments = np.concatenate([points[:-1], points[1:]], axis=1)
    norm = plt.Normalize(min(Speeds), max(Speeds))
    cmap = plt.cm.get_cmap('bwr')
    lc = LineCollection(segments, cmap=cmap, norm=norm)
    lc.set_array(np.array(Speeds))
    lc.set_linewidth(2)
    plt.gca().add_collection(lc)
    plt.xlim((min(traceXs),max(traceXs)))
    plt.ylim((min(traceYs),max(traceYs)))
    plt.show()
    
[/code]

のように書けるかと思います。

やっていることはほとんどサンプルと同様なので、説明はいらないと思いますが、

  1. 図１の各ラインをセグメントに分割
  2. 上記のデータより Colormapを適用した LineCollection を作成
  3. セグメント毎の Speed を LineCollection.set_array() で渡す
  4. axesにたいして、add_collection() にて LineCollection を追加

となります

[![画像の説明をここに入力](https://i.stack.imgur.com/jWauL.png)](https://i.stack.imgur.com/jWauL.png)


CC BY-SA 4.0
2018-12-26T04:39:57.040
51518
2018-12-26T04:39:57.040
24801
51512
answer