Зигзагообразная линия в Python - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь нарисовать зигзагообразную линию на другой линии.В моей базовой линии (цена) есть верхняя и нижняя точки.Я пытаюсь соединить верхнюю и нижнюю точки линией.Это пример:

enter image description here

Это мой набор данных:

enter image description here

И вот как далеко я могу зайти:

enter image description here

Любая помощь приветствуется.

Редактировать 1:

Это мой не рабочий код:

trend_index = target_out.columns.get_loc("trend_shifted")
close_index = target_out.columns.get_loc("price_close")

for i in range(1, len(target_out)):
       if target_out.iloc[i, trend_index] == target_out.iloc[i-1, trend_index] and target_out.iloc[i-1, trend_index] is not None:
            target_out.iloc[i, trend_index] = np.nan
            target_out.iloc[i-1, trend_index] = target_out.iloc[i-1, close_index]

# multiple line plot
plt.plot( 'ind', 'price_close', data=target_out, marker='o', markerfacecolor='blue', markersize=12, color='skyblue', linewidth=4)
plt.plot( 'ind', 'trend_shifted', data=target_out, marker='', color='olive', linewidth=2)
plt.legend()

trend_shifted столбец имеет ones и zeros.Первый элемент последовательных единиц и нулей - это фактически верхняя и нижняя точки зигзага.Остальные пункты не важны.После определения верхней и нижней точек мне нужно нарисовать линию, но поскольку цена и тренд имеют относительно разные значения, график не сбалансирован (я имею в виду, что цена равна 0,00001, но тренд равен 0 и 1)

Редактировать 2:

@ rgk код работает.Это вывод:

enter image description here

1 Ответ

1 голос
/ 06 марта 2019

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

df = pd.DataFrame({'price_close': np.random.uniform(low=1.186e-05, high=1.255e-05, size=9),
                   'trend_shifted': [bool(random.getrandbits(1)) for x in range(1, 10)]})

df['trend_plot'] = [np.nan] + [df.price_close[i] if df.trend_shifted[i] != df.trend_shifted[i-1] else np.nan for i in range(1, len(df))]
mask = np.isfinite(df.trend_plot)

plt.plot(df.index, df.price_close, linestyle='-', marker='o')
plt.plot(df.index[mask], df.trend_plot[mask], linestyle='-', marker='o')
plt.show()

example plot & data

...