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,

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=" ")

Aquí está mi salida. enter image description here

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

    Salida de la muestra: enter image description here

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

    ![enter image description here

    Pero esto no es recomendable porque las brechas todavía están allí como podemos ver cuando agrandamos la ventana de salida interactiva.

    enter code here

    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 de scipy.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 comparando y con su valor máximo. Los índices se utilizan para seleccionar los valores máximos correspondientes de x e y. 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