2016-02-15 67 views
2

我想打從CSV文件中的情節:gnuplot的 - 在一個陰謀使用第三個非整數參數

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列之後的日期,第三是我想的價值比較。 這給我只有一個情節。

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值)的稱號。

+0

你是說你想爲第二列中的每個唯一值分配一行 - 一行是_LG.04_,一行是_LG.03_,依此類推?使用gnuplot的數據模型很棘手。如果你提前知道這些值,那麼可以這樣做(但是這是一個醜陋的黑客攻擊),否則通常需要在gnuplot之外進行某種預處理。如果每個唯一時間都有一個值,那麼可以創建包含值的多個列,或者爲每個值創建單獨的塊,並使用_index_來繪製它們。 – Matthew

回答

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命令運行這些值中的每一個,並調用篩選程序僅返回對應於該值的行。過濾程序的輸出通過使用重定向操作符直接讀取。

enter image description here

在這裏,讓我感動的關鍵留下看守的數據從從它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 

+0

這就是我一直在尋找的!這很清楚謝謝你。 –

+0

不客氣。很高興我能幫上忙。 – Matthew