Я пытаюсь построить большой файл данных в python. Я хочу построить только пиковые точки и исключить нулевые точки данных. В файле данных есть точка, записанная в ходе эксперимента, и перед записью следующей точки также записывается нулевая точка. Я хочу исключить эти точки данных. Вот файл данных,
Вот код, который я использую
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt("data.txt", skiprows=1, dtype=np.float64)
xData, yData = np.hsplit(data,2)
x = xData[:,0]
y = yData[:,0]
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot( x,y, 'r.', markersize=4, label = " ")
Вот мой вывод
Я ожидаю экспоненциального затухания, так как максимумы точек показывают поведение.
@skuzzy Я добавил вывод.
Вы пробовали логическое индексирование? numpy.org/devdocs/reference/…
С r.
вы используете маркеры без каких-либо соединительных линий. Это в основном график рассеяния, а не линейный график. Это, в сочетании с тем фактом, что ваши значения x являются дискретными и не непрерывными, создает пробелы в вашем графике, а не нулевые значения. Вы можете использовать логическое индексирование для удаления нулевых значений, как это предлагается в комментариях. Однако их удаление не приведет к радикальному изменению внешнего вида вашего графика, потому что у вас так много разных значений y для каждого значения x, которые меньше максимального значения. Давайте воспользуемся другим подходом и рассчитаем максимальные значения для x-значения:
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("data.txt", names=["x", "y"], sep = "\t", skiprows=1)
tol = 5e-3
fig, ax = plt.subplots(figsize=(15, 6))
ax.scatter(df.x[df.y>tol], df.y[df.y>tol], s=1, label = "raw data")
ax.set_ylim(0, )
max_y = df.groupby("x").max()
ax.plot(max_y.index, max_y.y, color = "red", lw=4, label = "max values")
ax.legend()
plt.show()
Пример вывода:
Как мы видим, даже установка tol
выше нуля оставляет много точек на графике, скрывающих максимальное изображение, при удалении фактических точек данных для x> 80. Учитывая вашу структуру данных, у вас всегда будет точечная диаграмма, похожая на гистограмму, если только вы не сделаете маркеры настолько большими, что они сливаются со следующим столбцом:
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt("data.txt", skiprows=1, dtype=np.float64)
xData, yData = np.hsplit(data,2)
x = xData[:,0]
y = yData[:,0]
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y, 'r.', markersize=8, label = "only raw data")
ax.legend()
plt.show()
Но это не рекомендуется, потому что промежутки все еще существуют, как мы можем видеть, когда увеличим интерактивное окно вывода.
Предоставьте пример - образец ввода, ожидаемый вывод, ваш текущий вывод/ошибка/состояние.