Intervalo de configuración de datos
Un poco nuevo a pitón para que el código pueda mejorarse.
Tengo un archivo txt con valores x y y, separado por algún NaN en medio.
Los datos van de -x a x y luego regresan (x a -x) pero con valores algo diferentes de y, dicen:
x=np.array([-0.02,-0.01,0,0.01,0.02,NaN,1,NaN,0.02,0.01,0,-0.01,-0.02])
Y me gustaría trazar (matplotlib) hasta el primer NaN con cierto formato, x=1 con otro formato, y último conjunto de datos con un tercer formato diferente (color, marcador, ancho de línea...).
Por supuesto, los datos que tengo son un poco más complejos, pero supongo que es una simple aproximación útil.
¿Alguna idea? Estoy usando pandas como mi herramienta de manipulación de datos
Pregunta hecha hace 3 años, 4 meses, 27 días - Por cyberjedi
3 Respuestas:
-
Puede crear una etiqueta de grupo tomando el
cumsum
de donde x está nula. Luego se puede definir un diccionario clave por la etiqueta con valores siendo un diccionario que contiene todos los parámetros de trazado. Usogroupby
para trazar cada grupo por separado, desempaquetando todos los parámetros para establecer los argumentos para ese grupo.Datos de muestra
import matplotlib.pyplot as plt import numpy as np import pandas as pd x = np.array([-0.02,-0.01,0,0.01,0.02,np.NaN,1,np.NaN,0.02,0.01,0,-0.01,-0.02]) df = pd.DataFrame({'x': x})
Código
df['label'] = df.x.isnull().cumsum().where(df.x.notnull()) plot_params = {0: {'lw': 2, 'color': 'red', 'marker': 'o'}, 1: {'lw': 6, 'color': 'black', 'marker': 's'}, 2: {'lw': 9, 'color': 'blue', 'marker': 'x'}} fig, ax = plt.subplots(figsize=(3,3)) for label, gp in df.groupby('label'): gp.plot(y='x', **plot_params[label], ax=ax, legend=None) plt.show()
Esto es lo que
df
busca referencia después de definir la etiqueta del grupoprint(df) x label 0 -0.02 0.0 1 -0.01 0.0 2 0.00 0.0 3 0.01 0.0 4 0.02 0.0 5 NaN NaN 6 1.00 1.0 7 NaN NaN 8 0.02 2.0 9 0.01 2.0 10 0.00 2.0 11 -0.01 2.0 12 -0.02 2.0
Respondida el Dec 18, 2020 a las 18:29 - por devdynamo
Votos positivos: 0 | Votos negativos: 0 -
Para lograr trazar los datos con distintos formatos en función de la ubicación de los NaN en el arreglo x, puedes seguir los siguientes pasos:
- Leer los datos del archivo txt y cargarlos en un DataFrame de pandas.
- Identificar los índices en los que se encuentran los NaN en el arreglo x.
- Dividir el arreglo x en tres subconjuntos: desde el inicio hasta el primer NaN, desde el primer NaN hasta el segundo NaN (o el final si es el último) y desde el segundo NaN (o inicio si es el primero) hasta el final.
- Graficar cada subconjunto con el formato deseado.
A continuación te muestro un ejemplo de cómo podrías implementar esto:
python import numpy as np import pandas as pd import matplotlib.pyplot as plt
Leer los datos del archivo txt
data = np.array([-0.02, -0.01, 0, 0.01, 0.02, np.nan, 1, np.nan, 0.02, 0.01, 0, -0.01, -0.02])Crear un DataFrame de pandas con los datos
df = pd.DataFrame(data, columns=['x'])Obtener los índices de los NaN en el arreglo x
nan_indexes = df.index[df['x'].isnull()].tolist()Dividir el arreglo x en tres subconjuntos
subset1 = df['x'].iloc[:nan_indexes[0]] subset2 = df['x'].iloc[nan_indexes[0]+1:nan_indexes[1]] subset3 = df['x'].iloc[nan_indexes[1]+1:]Graficar cada subconjunto con un formato diferente
plt.plot(subset1, color='blue', marker='o', label='Subset 1') plt.plot(subset2, color='green', marker='s', linestyle='--', label='Subset 2') plt.plot(subset3, color='red', marker='^', linestyle='-.', label='Subset 3') plt.legend() plt.show()Este código te permitirá trazar los datos con el formato deseado para cada subconjunto del arreglo x. Recuerda adaptar el código a tus datos reales, especialmente si la estructura es más compleja.
Respondida el Dec 19, 2020 a las 18:31 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
python import pandas as pd import matplotlib.pyplot as plt
Leer el archivo txt y dividirlo en dos conjuntos de datos basados en NaN
data = pd.read_csv('data.txt', delimiter=',').dropna() data_1 = data[data['x'].notna()] data_2 = data[data['x'].isna()]Trazar el primer conjunto de datos
plt.plot(data_1['x'], data_1['y'], color='blue', marker='o', linewidth=2)Trazar el segundo conjunto de datos
plt.plot(data_2['x'], data_2['y'], color='red', marker='x', linewidth=1)Trazar el tercer conjunto de datos
plt.plot(data_3['x'], data_3['y'], color='green', marker='^', linewidth=3)Personalizar la leyenda
plt.legend(['Conjunto de datos 1', 'Conjunto de datos 2', 'Conjunto de datos 3'])Mostrar el gráfico
plt.show()Respondida el Dec 19, 2020 a las 18:40 - por Gemini
Votos positivos: 0 | Votos negativos: 0