/ / ¿Cómo trazar varios fragmentos de datos contenidos en un solo archivo? - python, r, matlab, matplotlib, gnuplot

¿Cómo trazar varios fragmentos de datos contenidos en un solo archivo? - python, r, matlab, matplotlib, gnuplot

Tengo un archivo que contiene 2 columnas divididas en bloques. Cada bloque tiene un encabezado seguido de algunos datos. Los bloques están separados entre sí por una línea vacía. Algo como:

x              y1
0              -65.950939
0.01417027519  -65.950969
0.02834055037  -65.950946
0.04251082556  -65.950961

x              y2
0              -39.797446
0.01417027519  -39.796663
0.02834055037  -39.794279
0.04251082556  -39.790951
:              :

¿Cómo puedo trazar este archivo usando MATLAB, xmgrace, gnuplot o cualquier otra herramienta relevante?

Respuestas

1 para la respuesta № 1

Aquí hay una manera de hacerlo en R

# Your data
df <- read.table(text="x              y1
0              -65.950939
0.01417027519  -65.950969
0.02834055037  -65.950946
0.04251082556  -65.950961

x              y2
0              -39.797446
0.01417027519  -39.796663
0.02834055037  -39.794279
0.04251082556  -39.790951")

# Create indicator for blocks
df$tag <-  cumsum(grepl("[[:alpha:]]",df$V1))

# Reomve letters from columns
df <- df[!grepl("[[:alpha:]]",df$V1),]

# Convert to numerics
df[] <- sapply(df , as.numeric)

#plot
library(ggplot2)

ggplot(df , aes(V1 , V2 )) + geom_point() + facet_wrap(~tag  , scales="free")

1 para la respuesta № 2

Suponiendo que tiene un archivo "data.dat", y suponiendo que está trabajando en Linux y que puede usar awk, esto es lo que yo sugeriría:

  • Use awk para eliminar el texto y para mostrar solo la cantidad de datos que desea mostrar
  • Use gnuplot internal for loop para mostrar sus datos como diagramas distintos.

Aquí hay un trabajo gnuplot comando si quieres probarlo por ti mismo. Utilizo un bucle for para mostrar sus dos fragmentos de datos, el truco es llamar al sistema awk, la variable awk a siendo el "selector de índice de fragmentos"

plot for [i=1:2] sprintf("< cat data.dat |  awk ""/./{ if ($1=="x") {a++} else if (a==%d) {print $0 }}""",i) u 1:2

Esta es la solución más fea que he encontrado para un problema :) Pero funciona !!

Esta es la imagen resultante

editar: necesitarás una versión decente de gnuplot, utilicé gnuplot 4.6 patchlevel 3.


0 para la respuesta № 3

Crea dos matrices en MathLab

A=[0 -65.950939; 0.01417027519 -65.950969; 0.02834055037 -65.950946; 0.04251082556 -65.950961]

B=[0 -39.797446; 0.01417027519 -39.796663; 0.02834055037 -39.794279; 0.04251082556 -39.790951]

entonces

plot(A,B)

También puede usar la función de trazado con múltiples pares de argumentos de matriz.

plot(x1,y1,x2,y2)