1

ランダムウォークを生成してプロットするコードがあります。ただし、ジャンプの大きさに応じて各行に色を付けたいと思います。これは私のコードです:

import matplotlib.pyplot as plt
import numpy as np
import random

def randomwalk(N):
    x, y, bigness = np.zeros((N)), np.zeros((N)), np.zeros((N))
    for n in range(0,N):
        angle = random.random() * 2*np.pi
        jump = np.random.normal(0, 50)

        x[n] = x[n-1] + (np.cos(angle) * jump)
        y[n] = y[n-1] + (np.sin(angle) * jump)
        bigness[n] = abs(jump)      
    return x, y, bigness

x, y, bigness = randomwalk(100)

plt.plot(x, y)
plt.show()

ここで、最後から 2 番目の行を

plt.scatter(x, y, c=bigness)

次に、必要な色のドットがたくさんありますが、それらをつなぐ線はありません。逆に、「プロット」機能には個別の色付けのオプションがありません。

「プロット」関数の線が必要ですが、「散布」関数の色付けが必要です。どうすればいいですか?

4

2 に答える 2

0

ライン全体をプロットするのではなく、そのセグメントを大きさに基づいた色でプロットします。

import matplotlib.pyplot as plt
import numpy as np
import random

def randomwalk(N):
    x, y, bigness = np.zeros((N)), np.zeros((N)), np.zeros((N))
    for n in range(0,N):
        angle = random.random() * 2*np.pi
        jump = np.random.normal(0, 50)

        x[n] = x[n-1] + (np.cos(angle) * jump)
        y[n] = y[n-1] + (np.sin(angle) * jump)
        bigness[n] = abs(jump)      
    return x, y, bigness

def random_color(bigness):
    return plt.cm.gist_ncar(bigness/100)

x, y, bigness = randomwalk(100)

xy = zip(x,y)
fig, ax = plt.subplots()
for start, stop, b in zip(xy[:-1], xy[1:], bigness):
    x, y = zip(start, stop)
    ax.plot(x, y, color=random_color(b))

plt.show()

美しい乱雑な結果

ここに画像の説明を入力

于 2016-03-24T06:49:44.640 に答える
0

を手動で作成し、次の方法LineCollectionで各セグメントに色を付けることができbignessます。

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
pairs = np.array(list(zip(x, y))).reshape(-1, 1, 2)
segments = np.concatenate((pairs[:-1], pairs[1:]), axis=1)
lc = mpl.collections.LineCollection(segments)
lc.set_array(bigness)
f, ax = plt.subplots()
ax.add_collection(lc)
ax.autoscale_view()
plt.show()

デフォルト以外のカラーマップとノルムを指定するには、cmapnorm引数をに渡しますmpl.collections.LineCollection

于 2016-03-24T06:49:45.293 に答える