gpt4 book ai didi

gnuplot - 计算 gnuplot for linux 中多个文件的列之间的平均值

转载 作者:行者123 更新时间:2023-12-02 21:10:09 25 4
gpt4 key购买 nike

我有一个目录列表(例如 0、50、100、150、200 等),每个目录都包含一个名为 zb_p.xy 的文件,其中包含两列数据。这些是此类文件的示例:

# file 0/zb_p.xy
1 0.1
2 0.2
3 0.15
4 0.11

# file 50/zb_p.xy
1 0.0
2 0.4
3 0.30
4 0.1

我想从所有 zb_p.xy 文件中提取第 2 列的数据,并使用 Linux 中的 gnuplot 绘制它们之间的平均值及其标准差。

这是我迄今为止的尝试:

LIST = system("ls -1 */zb_p.xy*")
FILES = words(LIST)
FILE(i) = word(LIST,i)
plot for [i=1:FILES] FILE(i)

MATLAB 中的这段代码似乎可以工作,但我需要 gnuplot 中类似的代码:

D=dir('*');
[s ~]=size(D);

for i=1:s
dirName=D(i,1).name;
cd(dirName) %steps into directory
fileID=load('zb_p.xy');
zb(:,i)=fileID(:,2);
cd .. %steps out of directory
end
zb_mean=mean(zb,2);
zb_std=std(zb,0,2);
errorbar(zb_mean,zb_std/sqrt(s),'sk')

最佳答案

您可以使用以下 bash 命令将所有文件粘贴到一个文件中:

# bash: paste filenames in directories 1, 2, and 3
paste */file.dat
# 1/file.dat # 2/file.dat # 3/file.dat
7 6 7 3 2 0
0 4 3 4 0 3
0 8 5 0 9 1
2 9 5 0 2 6
6 8 7 2 4 3

此输出可以作为临时文件(包含 6 列)传递给 gnuplot,以便您可以操作要绘制的列:

# gnuplot
data = "<( paste */file.dat )"
plot data u 1:(($2+$4+$6)/3.0) w lp pt 6 ps 2

编辑:对于上述内容和多个文件,列的数量可能会很大。列操作可以通过 awk 自动化。以下 awk 脚本计算每行第 2、4、6 等列的平均值和标准差(假设它名为 mean.awk):

#!/usr/bin/awk -f

# script mean.awk
{
mean=0
std=0

# calculate mean
for(i=2; i<=NF; i+=2) mean += $i

mean /= 0.5*NF

# calculate standard dev
for(i=2; i<=NF; i+=2) std += ($i-mean)*($i-mean)

std = sqrt(std/(0.5*NF-1))

print mean, std
}

处理数据的 bash 命令是

paste */file.dat | grep -v ^# | awk -f mean.awk
3 3
3.66667 0.57735
3 4.3589
5 4.58258
4.33333 3.21455

其中第一列和第二列分别是平均值和标准差。 grep命令是忽略以字符#开头的行。

最后,您可以在 gnuplot 中绘制 std-dev 与平均值的关系图:

data = "<( paste */file.dat | grep -v ^# | awk -f mean.awk )"
plot data u 1:2 w lp pt 6 ps 2

示例(不是最好的情节): Not the best plot ever

如果您不想编写 awk 脚本,这是单行命令版本:

data = "<( paste */file.dat | grep -v ^# | awk '{mean=0; std=0; for(i=2; i<=NF; i+=2) mean += $i; mean /= 0.5*NF; for(i=2; i<=NF; i+=2) std += ($i-mean)*($i-mean); std = sqrt(std/(0.5*NF-1)); print mean, std }' )"

plot data u 1:2 w lp pt 6 ps 2

关于gnuplot - 计算 gnuplot for linux 中多个文件的列之间的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33916560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com