Python: matplotlib: раскраска линий в случайном блуждании по размеру прыжка

У меня есть код, который генерирует и строит случайную прогулку просто отлично. Тем не менее, я хочу раскрасить каждую линию в зависимости от того, насколько она велика. Это мой код:

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()

Теперь, если я изменю предпоследнюю строку на

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

Затем я получаю кучу точек с требуемой окраской, но без линий, соединяющих их. И наоборот, функция "сюжет" не имеет возможности для отдельной раскраски.

Я хочу строки из функции plot, а раскраску из функции scatter. Как мне это сделать?

2 ответа

Вы можете вручную создать 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()

Чтобы указать цветовую карту и норму не по умолчанию, передайте cmap а также norm аргументы mpl.collections.LineCollection,

Вместо того, чтобы наносить на график всю линию, нарисуйте ее сегменты цветом, основанным на величине.

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()

Прекрасный грязный результат

Другие вопросы по тегам