Posiciones de pico de Plotting con matplotlib
Estoy tratando de trazar un archivo de datos grande en el pitón. Quiero trazar sólo los puntos máximos y excluir los puntos de datos que son cero. El archivo de datos tiene un punto registrado desde el experimento y antes de grabar el punto siguiente también se registra el punto cero. Quiero excluir estos puntos de datos. Aquí está el archivo de datos,
Aquí está el código que estoy usando
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=" ")
Estoy esperando una decadencia exponencial, ya que usted puede la máxima de los puntos mostrar el comportamiento.
Pregunta hecha hace 3 años, 4 meses, 26 días - Por pixelpioneer
3 Respuestas:
-
Con
r.
, utiliza marcadores sin líneas de conexión. Esto es básicamente una trama de dispersión, no una trama de línea. Esto, en combinación con el hecho de que sus valores x son discretos y no continuos, crea los huecos en su gráfico, no los valores cero. Puede utilizar la indexación booleana para eliminar valores cero, como se sugiere en los comentarios. Sin embargo, eliminarlos no cambiará drásticamente la apariencia de tu gráfico porque tienes tantos y-valores diferentes por x-valor que son más pequeños que el valor máximo. Tomemos un enfoque diferente y calculemos los valores máximos por valor 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()
Como podemos ver, incluso estableciendo
tol
por encima de cero hojas muchos puntos trazados oscureciendo la imagen máxima mientras se eliminan puntos de datos reales para x título80. Dada su estructura de datos, siempre tendrá con un diagrama de dispersión la apariencia de un gráfico de barras a menos que haga los marcadores tan grandes que se fusionan con la siguiente columna: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()
Pero esto no es recomendable porque las brechas todavía están allí como podemos ver cuando agrandamos la ventana de salida interactiva.
Respondida el Dec 19, 2020 a las 09:21 - por bugbusterx
Votos positivos: 0 | Votos negativos: 0 -
Para encontrar los picos de los datos que quieres graficar, puedes utilizar la función
find_peaks
descipy.signal
. Aquí te muestro cómo puedes modificar tu código para encontrar y graficar los picos de tu data:python import numpy as np import matplotlib.pyplot as plt from scipy.signal import find_peaks data = np.loadtxt("data.txt", skiprows=1, dtype=np.float64) xData, yData = np.hsplit(data, 2) x = xData[:, 0] y = yData[:, 0]
Encuentra los picos en los datos
peaks, _ = find_peaks(y, height=0)altura mínima de pico = 0 (para excluir los puntos de datos que son cero)
fig, ax = plt.subplots(figsize=(8, 6)) ax.plot(x, y, 'r.', markersize=4, label="") ax.plot(x[peaks], y[peaks], 'bo', markersize=8, label="Picos") plt.legend() plt.show()Con esta implementación, los picos en tus datos se identificarán y se mostrarán en azul en el gráfico, mientras que los puntos de datos que son cero se excluirán de la visualización. Espero que esta solución te sea útil. ¡Déjame saber si tienes alguna otra pregunta!
Respondida el Dec 20, 2020 a las 09:20 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Problema:
Estás intentando trazar solo los valores máximos de un conjunto de datos que contiene puntos cero, pero tu código actual está trazando todos los puntos.
Solución:
Para trazar solo los valores máximos y excluir los puntos cero, puedes usar la función
argwhere()
de NumPy para encontrar los índices de los valores máximos y luego usar esos índices para seleccionar los valores correspondientes de tu matriz de datos.Código modificado:
python import numpy as np import matplotlib.pyplot as plt
Carga los datos
data = np.loadtxt("data.txt", skiprows=1, dtype=np.float64)Separa en datos x e y
xData, yData = np.hsplit(data, 2) x = xData[:, 0] y = yData[:, 0]Calcula los índices de los valores máximos
max_idxs = np.argwhere(y == np.max(y))Selecciona los valores máximos
x_max = x[max_idxs] y_max = y[max_idxs]Traza los valores máximos
fig, ax = plt.subplots(figsize=(8, 6)) ax.plot(x_max, y_max, 'ro', markersize=4, label="Picos")Traza también los datos originales (opcional)
ax.plot(x, y, 'b.', markersize=1, label="Datos originales") plt.xlabel('Tiempo') plt.ylabel('Valor') plt.legend() plt.show()Explicación:
La función
argwhere()
devuelve una matriz de índices donde los valores de una matriz son verdaderos. En este caso, encuentras los índices de los valores máximos comparandoy
con su valor máximo. Los índices se utilizan para seleccionar los valores máximos correspondientes dex
ey
. Los valores máximos se trazan como puntos rojos en la gráfica. Opcionalmente, también puedes trazar los datos originales como puntos azules para referencia.Salida:
La salida del código modificado mostrará una gráfica con solo los valores máximos, excluyendo los puntos cero. Esto debería mostrar la decadencia exponencial esperada en tus datos.
Respondida el Dec 20, 2020 a las 09:32 - por Gemini
Votos positivos: 0 | Votos negativos: 0