如何绘制单个文件中包含的几个数据块?

时间:2014-03-13 12:39:28

标签: python r matlab matplotlib gnuplot

我有一个包含2列的文件。每个块都有一个标题,后跟一些数据。这些块通过空行彼此分开。类似的东西:

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
:              :

如何使用MATLAB,xmgrace,gnuplot或任何其他相关工具绘制此文件?

3 个答案:

答案 0 :(得分:1)

以下是在 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 :(得分:1)

假设你有一个文件“data.dat”,假设你正在使用linux并且你可以使用awk,这就是我的建议:

  • 使用awk删除文本并仅显示要显示的数据块
  • 使用gnuplot internal for循环,以便将数据显示为不同的图。

如果您想自己尝试,可以使用 gnuplot 命令。我使用for循环来显示你的两个数据块,诀窍是系统调用awk,awk变量a是“块索引选择器”

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

这是我遇到问题时最丑陋的解决办法:) 但它的确有效!!

This is the resulting picture

编辑:你需要一个体面的gnuplot版本,我使用了gnuplot 4.6 patchlevel 3.

答案 2 :(得分:0)

在MatLab中创建两个矩阵

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]

然后

plot(A,B)

您还可以将绘图函数与多对矩阵参数一起使用。

plot(x1,y1,x2,y2)