Как устранить соединительную линию при построении развернутой функции - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь выяснить, как устранить ложную «соединительную линию», которая возникает, когда функция «нарезается» так, чтобы она отображалась только в одном интервале. Например, предположим, что у меня есть угловая функция, которая расширяется от нуля до 10 пи (или, возможно, даже больше), и я хочу построить эту функцию только в диапазоне от 0 до 2 пи. Я могу использовать операцию по модулю для исправления данных, но если я нанесу ее на график, я получу линию, которая соединяет от 2 пи до нуля, которую я не хочу строить. Вот код, который показывает, о чем я говорю.

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 10*np.pi, 1000)
y = t + np.sin(t)      
t2 = t%(2*np.pi)
plt.plot(t2, y)
plt.show()

Полученный график имеет ряд горизонтальных линий, которые мне не нужны (см. Изображение ниже). Я провел некоторое исследование по этому вопросу и не нашел никакого простого способа справиться с этой ситуацией, но, похоже, это было бы довольно распространенным явлением.

Есть идеи?

enter image description here

Кстати, я имею дело с довольно большим набором данных, поэтому я не очень хорошо могу что-либо делать «вручную».

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

В общем, вы можете использовать NaN, чтобы вставить разрыв в точку. В конкретном случае, который вы показали, вы можете использовать np.diff для определения разрывов и установить значение t2 в этих местах на NaN, что приведет к желаемым разрывам

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 10*np.pi, 1000)
y = t + np.sin(t)
t2 = t % (2*np.pi)

# Compute the difference between successive t2 values
diffs = np.append(np.diff(t2), 0)

# Find the differences that are greater than pi
discont_indices = np.abs(diffs) > np.pi

# Set those t2 values to NaN
t2[discont_indices] = np.nan

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

enter image description here

0 голосов
/ 01 ноября 2018

Вы можете подойти к той же проблеме немного по-другому: создайте x-сетку от 0 до 2 * pi, а затем добавьте смещение для y для построения пяти различных кривых. Ключевым моментом здесь является исключение последней точки t с использованием индекса [0:-1] во избежание продолжения строки.

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 2*np.pi, 1000)
t = (t%(2*np.pi))[0:-1]

for i in range(5):
    y = t+ np.sin(t) + i*2*np.pi
    plt.plot(t, y, 'b')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...