Как построить пунктирный "конус" постоянного наклона вокруг набора точек в matplotlib?

У меня есть некоторый код Python, который я использую для создания графиков случайного блуждания. Прогулка отразится на барьерах [-a,a]. Последующее значение в последовательности генерируется

r[n] = r[n-1] + Uni[-R, R]

который затем отражается по мере необходимости. То, что я хочу сделать, это построить "конус неопределенности", [-R, R] вокруг каждой точки.

Вот код Python, который я получил до сих пор:

import matplotlib.pyplot as plt
import random

uni = random.uniform

t = []
r = []

r0 = .15  # Seed for our random walk. Can be between -a and a
a = .2  # Distance of barriers from 0. Should be in (0, 1]
R = .04  # Height of half-cone in r-direction
dt = 20  # Sample period
N = 20  # Number of samples

cone_ls = ':'
cone_clr = 'blue'#[0, .5, .5]

for i in range(N):
    t.append(i*dt)
    if i == 0:
        r.append(r0)
    else:
        '''
        When our cone of uncertainty outpaces out barriers,
        simply sample uniformly inside the barriers.
        '''
        if(R > 2*a):
            r.append(uni(-a, a))
            continue
        rn = r[i - 1] + uni(-R, R)
        '''
        If the sampled value comes above the upper barrier,
        reflect it back below.
        '''
        if(rn > a):
            r.append(2*a - rn)
            continue
        '''
        If the sampled value comes below the lower barrier,
        reflect it back above.
        '''
        if(rn < -a):
            r.append(-2*a - rn)
            continue
        '''
        Otherwise just append the sampled value.
        '''
        r.append(rn)
# Plot cones
for i, pt in enumerate(r):
    plt.plot([t[i], t[i] + dt], [pt, pt + R], linestyle=cone_ls, color=cone_clr, linewidth=2)
    plt.plot([t[i], t[i] + dt], [pt, pt - R], linestyle=cone_ls, color=cone_clr, linewidth=2)

plt.plot(t, r, 'ro')
plt.plot(t, [a]*N)
plt.plot(t, [-a]*N)
plt.axis([min(t), max(t), -2*a, 2*a])
plt.xlabel('Time (min)')
plt.ylabel('Relative Difference, r')
plt.show()

Я хотел бы, чтобы график выглядел следующим образом после добавления конусов:

случайная прогулка с шишками

Я также собираюсь включить это в газете, поэтому любые советы по украшению приветствуются.

редактировать: решено, понял, что мне просто нужно построить конусы в отдельности.

1 ответ

Решение

Вы можете просто построить две линии, из которых состоит конус, для каждой точки в ваших данных

for i in range(N):
    plt.plot([t[i]+dt,t[i],t[i]+dt],[r[i]-R,r[i],r[i]+R], color="#808080")

В конце вам также нужно установить пределы х max(t)+dt
plt.axis([min(t), max(t)+dt, -2*a, 2*a])

введите описание изображения здесь

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