2012-05-01 11 views
0

У меня есть большой объем данных для построения, и я пытаюсь использовать gnuplot. Данные представляют собой отсортированный массив из примерно 80000 элементов. Просто с помощьюСгруппированные данные для построения данных

plot "myData.txt" using 1:2 with linespoints linetype 1 pointtype 1 

я получаю выход, но: это занимает много времени, чтобы сделать, и точки, часто суматохой, со случайными пробелами. Чтобы обратиться ко второму, я подумал о том, чтобы делать гистограмму: каждая из записей будет соответствовать бару. Однако я не уверен, как это достичь. Я хотел бы иметь некоторое пространство между последовательными барами, но я не ожидаю, что это будет видно. Каково было бы ваше предложение построить данные?

........................

Из-за большой объем данных, я думаю, что лучше группы. Обратите внимание, что мои данные выглядит

1 11041.9 
2 11041.9 
3 9521.07 
4 9521.07 
5 9520.07 
6 9519.07 
7 9018.07 
... 

Я хотел бы построить на данных с помощью групп 3, то есть., Первая вертикальная линия должна начинаться 9521.07 как минимум из точек с 1, 2, 3 , и заканчивается на 11041. Вторая вертикальная линия должна учитывать следующие 3 точки: 4, 5 и 6 и начинаться с 9519.07 с окончанием на 9521.07 и т. д.

Возможно ли это с помощью gnuplot, учитывая файл данных, как показано на рисунке? Если это так, я был бы признателен, если бы кто-то отправил набор команд, которые я должен использовать.

ответ

2

Чтобы уменьшить количество точек, набранных gnuplot, вы можете использовать ключевое слово every, например.

plot "myData.txt" using 1:2 with linespoints linetype 1 pointtype 1 every 100 

будет строить каждую 100-ю точку данных.

Я не уверен, что можно сделать то, что вы хотите (построив вертикальные линии) изящно внутри gnuplot, но вот мое решение (предполагая среду UNIX-y). Во-первых сделать AWK сценарий под названием sort.awk:

BEGIN { RS = "" } 
{ 
# the next two lines handle the case where 
# there are not three lines in a record 
xval = $1 + 1 
ymin = ymax = $2 
# find y minimum 
if ($2 <= $4 && $2 <= $6) 
    ymin=$2 
else if ($4 <= $2 && $4 <= $6 && $4 != "") 
    ymin=$4 
else if ($6 <= $2 && $6 <= $4 && $6 != "") 
    ymin=$6 
# find y maximum 
if ($2 >= $4 && $2 >= $6) 
    ymax=$2 
else if ($4 >= $2 && $4 >= $6) 
    ymax=$4 
else if ($6 >= $2 && $6 >= $4) 
    ymax=$6 
# print the formatted line 
print ($1+1) " " ymin " " ymin " " ymax " " ymax 
} 

Теперь этот Gnuplot скрипт будет вызывать его:

set terminal postscript enhanced color 
set output 'plot.eps' 

set boxwidth 3 
set style fill solid 
plot "<sed 'n;n;G;' myData.txt | awk -f sort.awk" with candlesticks title 'pretty data' 

Это не красиво, но это работает. sed добавляет пустую строку каждые 3 строки, а awk форматирует выход для стиля candlesticks. Вы также можете попробовать встраивать awk-скрипт в скрипт gnuplot.

+0

Спасибо. Я решил сгруппировать данные, как можно заметить из моего редактирования вопроса. Надеюсь, у вас будут полезные комментарии. – user506901

+0

Посмотреть мой отредактированный пост. – andyras

1

Вы можете сделать что-то подобное ... (это будет проще всего в unix). Вам нужно будет вставить пробел в каждую третью строку - я не вижу никакого способа обойти это. Если вы находитесь в режиме unix, команда

awk 'NR % 3 == 0 {print ""} 1' myfile 

должен сделать это. (см. How do I insert a blank line every n lines using awk?)

Конечно, вы могли бы (и, вероятно, должны) упаковать это прямо в ваш файл gnuplot.

Итак, все сказано и сделано, вы бы что-то вроде этого:

xval(x)=int(x)/3 #Return the x position on the plot 
plot "< awk 'NR % 3 == 0 {print ""} 1' datafile" using (xval($1)):2 with lines