【问题标题】:Gnuplot - Use a 3rd non integer parameters in a plotGnuplot - 在绘图中使用第三个非整数参数
【发布时间】:2016-02-15 10:18:50
【问题描述】:

我想从一个 csv 文件中绘制一个图:

02/15/2016 09:32:58,LG.04,4747.0
02/15/2016 09:33:08,LG.03,2899.0
02/15/2016 09:33:18,LG.01,5894.0
02/15/2016 09:33:28,LG.04,6043.0

使用第 1 列是日期,第 3 列是我要比较的值。 这给了我一个情节。

  reset
    date = system("date +%m-%d-%Y")
    set datafile separator ","
    set timefmt '%m/%d/%Y %H:%M:%S'
    set xdata time
    set format x "%m/%d/%Y\n%H:%M:%S"
    #
    plot '/home/'.system("echo $USER").'/Desktop/test.csv' u 1:3:2 w lp
    pause 200

我想知道如何使用第二列获取多行,并定义不同列的标题(使用 csv 值)。

【问题讨论】:

  • 您是说第二列中的每个唯一值都需要一行 - LG.04 一行,LG.03一行> 等等?使用 gnuplot 的数据模型很棘手。如果您提前知道这些值(但这是一个丑陋的黑客),则可以完成,否则通常需要在 gnuplot 之外进行某种预处理。如果每个唯一时间都有一个值,则可以依次创建包含这些值的多个列,或者为每个值创建单独的块并使用 index 来绘制它们。

标签: bash csv gnuplot


【解决方案1】:

为此,您需要使用外部程序来过滤和重组数据。我将使用 python3 演示这一点。

我们需要两个 python 程序。第一个,getnames.py,将为我们提供第 2 列中的唯一值列表:

data = open("test.csv","r").readlines()
names = [x.split(",")[1] for x in data]
print(" ".join(sorted(set(names))))

第二个,filternames.py,将为我们获取数据文件中与第 2 列中每个唯一值相对应的行:

from sys import argv

nme = argv[1]

data = open("test.csv","r").readlines()
for x in data:
    if x.split(",")[1] == nme:
        print(x.strip())

然后,在 gnuplot 中,我们可以调用这些程序来处理数据。

set datafile separator ","
set timefmt '%m/%d/%Y %H:%M:%S'
set xdata time
set format x "%m/%d/%Y\n%H:%M:%S"
names = system("getnames.py")
plot for [n in names] sprintf("< filternames.py %s",n) u 1:3 with linespoints t n

第一个系统调用将获得一个字符串,其中包含第二列的空格分隔的唯一值(“LG.01 LG.03 LG.04”)。

plot 命令遍历这些值中的每一个,并调用过滤程序以仅返回与该值对应的行。过滤程序的输出使用重定向操作符直接读取。

在这里,我将键移到左侧以使用set key left 阻止数据进入。

如果有的话,我们可以使用标准的 linux 命令来做同样的事情。除了使用 getnames.py 程序,我们可以这样做

names = system("awk -F, '{print $2}' test.csv | sort | uniq | tr '\n' ' '")

使用 awk 获取第二列值,uniq 仅获取唯一值(这需要使用 sort 对值进行排序) 和 tr 用空格替换换行符(将值作为一个空格分隔的列表返回)。

我们可以这样做

,而不是使用 filternames.py
plot for [n in names] sprintf("< awk -F, '($2=="%s"){print $0}' test.csv",n) u 1:3 with linespoints t n

使用 awk 仅获取具有所需第二列值的行。

【讨论】:

  • 这正是我想要的!一切都清楚了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多