matplotlib 如何从文件中获取特定文本?

4dc9hkyq  于 2023-06-23  发布在  其他
关注(0)|答案(5)|浏览(113)

我生成了一个具有以下格式的数据文件:

0.1
Analytic value = 340.347685734
Approximated value = 332.45634555
--
0.2
Analytic value = 340.936745872
Approximated value = 332.57893789
--
0.3
... and so on

我想在matplotlib/gnuplot中针对输入参数(0.1,0.2等)绘制解析值和近似值。通常,在生成数据文件之前,我使用awk脚本生成它们,该脚本将三个值放在三列中,这非常容易绘制。但是,在这里我意外地生成了不同格式的数据文件。如何将此文本文件转换为以下格式(可能使用正则表达式或awk!):

0.1 340.347685734 332.45634555 
0.2 340.936745872 332.57893789
0.3 ... and so on

或者有没有一种方法可以不转换格式而使用gnuplot/matplotlib绘制数据?

**编辑:**我已经尝试使用python3。以下是我的代码:

file = open("myFile.dat",'r')
newFile = open("newFile.dat", 'a')
for i in range(4000):
  col1 = file.readline().split[-1]
  col2 = file.readline().split[-1]
  col3 = file.readline().split[-1]
  _ = file.readline().split[-1]
  line = col1 + " " + col2 + " " + col3
  newFile.write(line)

然而,我得到了一些错误TypeError: 'builtin_function_or_method' object is not subscriptable,我不明白,我认为这是一个非常低效的代码。这就是为什么我问了。到目前为止提出的所有解决方案都工作得很好。我用awk标记解决方案作为可接受的答案,因为它简单而优雅。另外,我很欣赏只使用gnuplot的解决方案,这也为我揭示了gnuplot的一面。

icomxhvb

icomxhvb1#

我将利用GNU AWK来完成这项任务,如下所示,让file.txt内容

0.1
Analytic value = 340.347685734
Approximated value = 332.45634555
--
0.2
Analytic value = 340.936745872
Approximated value = 332.57893789
--

然后

awk '/^--$/{print "";next}{printf "%s ",$NF}' file.txt

剂量输出

0.1 340.347685734 332.45634555 
0.2 340.936745872 332.57893789

说明:对于--行,只需打印换行符并转到下一行,对于所有其他行,输出最后一个字段,后面是空格,而不是换行符。如果您想了解更多关于NF的信息,请阅读8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

  • (在GNU Awk 5.1.0中测试)*
plicqrtu

plicqrtu2#

这里不需要Regex。4个简单的替换:
两次替换不需要的文本,一次替换删除换行符,一次替换再次插入换行符。

file = """0.1
Analytic value = 340.347685734
Approximated value = 332.45634555
--
0.2
Analytic value = 340.936745872
Approximated value = 332.57893789
--
0.3
... and so on
"""

file = file.replace("Analytic value = ","")
file = file.replace("Approximated value = ","")
file = file.replace("\n"," ")
file = file.replace("-- ","\n")
print(file)

结果:

0.1 340.347685734 332.45634555 
0.2 340.936745872 332.57893789 
0.3 ... and so on
b91juud3

b91juud33#

有很多方法可以解决这个问题,其中的选择将取决于文件大小。这里有一个简单的解决方案,用于无法一次加载整个文件-您必须逐行处理它,

raw_data_file = 'data.txt'
out_data_file = 'data_final.txt'

counter = 0
with open(raw_data_file, 'r') as fin, open(out_data_file, 'w') as fout:
    temp_line = []
    for line in fin:

        if counter == 0:
            # First column
            temp_line.append(line.strip())
            counter += 1
            continue
        elif counter == 1:
            # Analytic value column
            temp_line.append(line.strip().split()[-1])
            counter += 1
            continue
        elif counter == 2:
            # Approximate value column
            temp_line.append(line.strip().split()[-1])
            counter += 1
        elif counter == 3:
            # Skip the -- and reset the counter
            counter = 0
            continue

        # Write the rearranged data to file
        fout.write((' ').join(temp_line))
        fout.write('\n')
        temp_line = []

请注意,此解决方案紧密依赖于您提供的文件的结构。

zfciruhq

zfciruhq4#

或者有没有一种方法可以不转换格式而使用gnuplot/matplotlib绘制数据?

**是的,有!**这里是一个独立于平台的gnuplot解决方案。无需外部额外的数据准备工具。

如果从文件打印,请跳过$Data <<EOD ... EOD部分,使用plot 'yourFile.dat' ...

脚本:(适用于gnuplot>=5.0.6,2017年3月)

### plot special data format
reset session

$Data <<EOD
0.1
Analytic value = 340.347685734
Approximated value = 332.45634555
--
0.2
Analytic value = 340.936745872
Approximated value = 332.57893789
--
0.3
Analytic value = 341.936745872
Approximated value = 333.57893789
EOD

set datafile missing NaN
set key out
myFilter(colD,colF,valF) = strcol(colF) eq valF ? column(colD) : NaN

plot $Data u (valid(1)?x0=$1:x0):(myFilter(4,1,"Analytic"))     w lp pt 7 lc "red"  ti "analytic", \
        '' u (valid(1)?x0=$1:x0):(myFilter(4,1,"Approximated")) w lp pt 7 lc "blue" ti "approximated"
### end of script

结果:

2hh7jdfx

2hh7jdfx5#

使用任何awk:

$ awk '{n=(NR%4); val[n]=$NF} n==0{print val[1], val[2], val[3]}' file
0.1 340.347685734 332.45634555
0.2 340.936745872 332.57893789

相关问题