爲此,您需要使用外部程序來過濾和重新組織數據。我將用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程序,我們可以使用AWK得到第二列的值做
names = system("awk -F, '{print $2}' test.csv | sort | uniq | tr '\n' ' '")
,uniq的只得到唯一值(這需要與排序的值sort)和tr用空格替換換行符(將值返回爲一個空格分隔的列表)。
而不是使用filternames.py的,我們可以用AWK只得到與期望的第二列的值線做
plot for [n in names] sprintf("< awk -F, '($2=="%s"){print $0}' test.csv",n) u 1:3 with linespoints t n
。
你是說你想爲第二列中的每個唯一值分配一行 - 一行是_LG.04_,一行是_LG.03_,依此類推?使用gnuplot的數據模型很棘手。如果你提前知道這些值,那麼可以這樣做(但是這是一個醜陋的黑客攻擊),否則通常需要在gnuplot之外進行某種預處理。如果每個唯一時間都有一個值,那麼可以創建包含值的多個列,或者爲每個值創建單獨的塊,並使用_index_來繪製它們。 – Matthew