2012-08-25 3 views
4

I 데이터는 이런 (파일 이름 '데이터') 설정 :

a 10.1
b 10.1
c 10.2
b 15.56
a 3.20
나는 지점으로,이 데이터를 플롯하고 싶다. 내가 시도 할 때 :
plot 'data' using 2:xticlabels(1)
나는 a, b, c, b, a 5 축 값으로 플롯을 얻지 만 플롯의 경우 3 (a, b, c (순서는 중요하지 않음))을 얻고 싶다. 모든 5 y 값을가집니다. 가능한가?
2-8-16-17-18 962.623408
2-3-4-5-6 -97.527840
2-8-9-10-11 962.623408
2-8-9-10-11 937.101308
2-3-4-5-6 37.101308

을 약 천 레코드가 :의 gnuplot는 비 수치 반복 X 값은

내 실제 데이터 파일은 다음과 같다.


나는 mgilson의 코드를 사용하는 방법을 모르지만 그는 나에게 아이디어를 제공합니다. 의 gnuplot에 ploting하는 것은 쉬운

1 a 10.1 
2 b 10.1 
3 c 10.2 
2 b 15.56 
1 a 3.20
후 : 내가 데이터 파일 추가 열 (인덱스)에 추가

#!/usr/bin/perl 
$index_number = 0; 
while (<>) 
{ 
    $line = $_; 
    @columns = split(" ",$line); 
    $col1 = $columns[0]; 
    $col2 = $columns[1]; 
    if(not exists $non_numeric{$col1}) 
    { 
     $index_number++; 
     $non_numeric{$col1} = $index_number; 
    } 
    print "".$non_numeric{$col1}."\t".$col1."\t".$col2."\n"; 
} 
+1

x 축의 순서가 실제로 중요합니까? – mgilson

답변

1

I : 나는 펄을 사용
plot 'data' u 1:3

, 그래서 내 스크립트는 다음과 같이 lookls 당신이 gnuplot 전용 솔루션을 생각해 낼 수 있을지 의심해라. 그러나이 은 시스템에 python2.5 이상이 설치되어있는 한이어야합니다. (테스트 데이터와 함께 작동합니다).

import sys 
import collections 

data = collections.defaultdict(list) 
keys = [] 

# build a mapping which maps values to xticlabels (hereafter "keys") 
# Keep a second keys list so we can figure out the order we put things into 
# the mapping (dict) 
with open(sys.argv[1]) as f: 
    for line in f: 
     key,value = line.split() 
     data[key.strip()].append(value) 
     keys.append(key.strip()) 

def unique(seq): 
    """ 
    Simple function to make a sequence unique while preserving order. 
    Returns a list 
    """ 
    seen = set() 
    seen_add = seen.add 
    return [ x for x in seq if x not in seen and not seen_add(x) ] 

keys = unique(keys) #make keys unique 

#write the keys alongside 1 element from the corresponding list. 
for k in keys: 
    sys.stdout.write('%s %s\n' % (k, data[k].pop())) 

# Two blank lines tells gnuplot the following is another dataset 
sys.stdout.write('\n\n') 

# Write the remaining data lists in order assigning x-values 
# for each list (starting at 0 and incrementing every time we get 
# a new key) 
for i,k in enumerate(keys): 
    v = data[k] 
    for item in v: 
     sys.stdout.write('%d %s\n' % (i, item)) 

이제 스크립트는이 플롯이 어떻게 작동하는지

set style line 1 lt 1 pt 1 
plot '<python pythonscript.py data' i 0 u 2:xticlabels(1) ls 1,\ 
    '' i 1 u 1:2 ls 1 notitle 

는 여기에 있습니다. plot ... u 2:xticlabels(1) 같은 것을하면, gnuplot 암시 적으로은 0부터 시작하는 순차적 인 정수 x 값을 데이터 포인트에 할당합니다. 파이썬 스크립트는이 사실을 이용하기 위해 데이터를 재정렬합니다. 기본적으로 첫 번째 열의 "키"를 해당 키에 해당하는 요소 목록에 매핑하는 매핑을 만듭니다. 즉, 더미 데이터 파일에서 'a' 키는 값 목록 [10.1, 3.2]에 매핑됩니다. 그러나 파이썬 사전 (매핑)은 주문되지 않습니다. 따라서 순서를 유지하는 두 번째 목록을 유지합니다 (축이 'c', 'a', 'b'대신 'a', 'b', 'c'로 표시되도록). 축 목록이 고유한지 확인하여 필요한 데이터를 인쇄 할 수 있습니다. 2 패스로 데이터를 씁니다. 첫 번째 패스는 매핑 "키"와 함께 각 목록에서 하나의 값만 인쇄합니다. 두 번째 패스는 나머지 값을 gnuplot이 암시 적으로 할당 할 x 값과 함께 출력합니다. 두 데이터 세트 사이에 빈 줄 2 개를 삽입하여 gnuplot이 index 키워드 (여기서는 축약 된 i)를 사용하여 차이를 분류 할 수 있습니다. 이제 우리는 두 데이터 집합을 그에 맞게 플롯해야합니다. 먼저 우리는 라인 스타일을 설정하여 양쪽 패스가 같은 스타일로 그려지도록 할 것입니다. 그런 다음 파이썬 스크립트가 계산 한 x 값, y 값 쌍 (u 1:2)을 사용하여 xticlabels 및 인덱스 1을 사용하여 인덱스 0 (첫 번째 데이터 세트)을 플롯합니다. 죄송합니다 설명은 길다 (원래 버전은 약간 버그가 있음). 행운과 행복 gnuplotting!