Построение пиковых позиций с помощью matplotlib

Я пытаюсь построить большой файл данных в 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 19.12.2020 10:19

@skuzzy Я добавил вывод.

user12298516 19.12.2020 10:22

Вы пробовали логическое индексирование? numpy.org/devdocs/reference/…

skuzzy 19.12.2020 10:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
384
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Но это не рекомендуется, потому что промежутки все еще существуют, как мы можем видеть, когда увеличим интерактивное окно вывода.

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