Может ли gnuplot разделить данные? - PullRequest
1 голос
/ 23 сентября 2011

У меня есть данные в следующем формате:

10.0 1 a 2
10.2 2 b 2
10.4 3 a 2
10.6 4 b 2
10.8 4 c 10
11.0 4 c 20

... где третий столбец в основном указывает на принадлежность к «отдельному» набору данных; и поэтому я хотел бы показать, скажем, те образцы, которые принадлежат букве «а», красным цветом, образцы, принадлежащие букве «б», синим цветом и т. д. (используя gnuplot версия 4.4, уровень исправления 2).

Мне удалось как-то получить образец стиля как смесь стилей impulses и point; и через Выбор типа линии и цвета в Gnuplot 4.0 , удалось использовать отдельные цвета - вот как далеко я продвинулся ( basictest.gnuplot ):

#!/usr/bin/env gnuplot

print "Generating data..."

# to specify data inline in script:
# only system can work, as it is quoted;
# but still have to escape newlines!

system "cat > ./inline.dat <<EOF\n\
10.0 1 a 2\n\
10.2 2 b 2\n\
10.4 3 a 2\n\
10.6 4 b 2\n\
10.8 4 c 10\n\
11.0 4 c 20\n\
EOF\n"

print "done generating."


# set ranges
set yrange [0:30]
set xrange [0:4]

# define line styles - can call them up later
set style line 1 linetype 1 linewidth 3 pointtype 3 linecolor rgb "red"
set style line 2 linetype 1 linewidth 2 pointtype 3 linecolor rgb "green"
set style line 3 linetype 1 linewidth 2 pointtype 3 linecolor rgb "blue"


# offset the X axis: instead of 1:2, use: ($1-10):2
# to "mix", use "" for last datset - but must also repeat the "using"!
# ... and plot:

plot 'inline.dat' using ($1-10):2 with impulses linestyle 1,\
     "" using ($1-10):2 notitle with points linestyle 1,\
     "" using ($1-10):2 notitle with lines linestyle 2,\
     'inline.dat' using ($1-10):4 with impulses linestyle 3,\
     "" using ($1-10):4 notitle with points linestyle 3

# below just for saving file
#set terminal png
#set output 'basictest.png'
#replot

... который выглядит так:

basictest.png

Другими словами, вместо вышеупомянутого - скажем, за (1-10 $): 2, я хотел бы видеть 1 st и 3 rd sample ('a ') синим цветом, 2 и и 4 th сэмплом (' b ') красным, а последние два (' c ') зеленым ( Я оставил зеленый линия, чтобы увидеть эффект смешения стилей ).

Я знаю, что этого можно достичь, написав скрипт, который будет анализировать исходные данные и генерировать из них три таблицы, например:

10.0 1 a 2
10.4 3 a 2
---
10.2 2 b 2
10.6 4 b 2
---
10.8 4 c 10
11.0 4 c 20

... который затем можно было бы построить «отдельно» - но я бродил, если бы gnuplot, возможно, имел какую-то внутреннюю возможность для чего-то подобного?

Заранее спасибо за любые ответы,
Ура!

PS: Несколько полезных ссылок для меня:

РЕДАКТИРОВАТЬ: просто хотел опубликовать ссылку на скрипт , с помощью которого я приближаюсь к визуализации данных так, как я хотел:

basic-labels.png

Я хочу обработать метки (с добавленными «точками» в качестве фона прямоугольника) как узлов в graphviz или в TikZ , и установить эти хорошие линии связи между ними - но даже это уже очень мне помогает :) Обратите внимание, что это вывод wxt - другие терминалы, такие как png или pdfcairo, будут иметь полностью испорченный рендеринг коробок / меток ( и нужно будет настраивать вручную).

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

Вы можете использовать awk для этого. Я не знаю, назову ли я это "внутренним средством" gnuplot, но я думаю, что оно делает то, что вы хотите:

С файлом данных Data.csv:

10.0 1 a 2
10.2 2 b 2
10.4 3 a 2
10.6 4 b 2
10.8 4 c 10
11.0 4 c 20

выведите данные с помощью

plot "<awk '{if($3 == \"a\") print $1,$2}' Data.csv" u ($1 - 10):2 w lp, \
     "<awk '{if($3 == \"b\") print $1,$2}' Data.csv" u ($1 - 10):2 w lp, \
     "<awk '{if($3 == \"c\") print $1,$2}' Data.csv" u ($1 - 10):2 w lp

Обратите внимание на \" для выхода из синтаксического анализатора скриптов ^^.
Что касается вопросов стиля сюжета, вы можете использовать весь спектр возможностей gnuplot.

2 голосов
/ 23 сентября 2011

Это возможно. Gnuplot имеет троичный оператор, как в C. Gnuplot также будет игнорировать неопределенные выражения, такие как логарифмы отрицательных чисел или деление на ноль. Собрав их вместе, вы можете построить только те линии, которые удовлетворяют определенному условию, создав недопустимые числа для тех, которые не удовлетворяют условию. Немного упрощая вопрос, подход выглядит так:

plot "inline.dat" using (strcol(3) eq 'a' ? $1 : 1/0):2
...