Построение стрелок с помощью гнуплота - PullRequest
6 голосов
/ 27 января 2011

У меня есть данные, сгенерированные в симуляции.Сгенерированный файл данных выглядит примерно так:

1990/01/01 99
1990/01/02 92.7
1990/01/03 100.3
1990/01/04 44.2
1990/01/05 71.23
...
2100/01/01 98.25

Я могу создать диаграмму (тривиально), просто выполнив (длинную версию) команду:

plot "simulation.dat" using 1:2 with line

Я хочу добавитьтретий столбец, который будет добавлять информацию о стрелке.Кодировка для третьего столбца будет выглядеть следующим образом:

  • 0 => стрелка не должна быть нарисована для этого значения оси x
  • 1 => указывающая стрелка вверх для рисованиязначение оси x
  • 2 => стрелка ВНИЗ для значения оси x

Я только начинаю изучать gnuplot и буду признателен за помощь в том, как я могу использоватьgnuplot для создания стрелок на первом сюжете?

Ответы [ 3 ]

3 голосов
/ 27 января 2011

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

Есливам действительно нужны стрелки, тогда может помочь следующее: он использует цикл for (или сортирует) для добавления вертикальных стрелок к графику.

скрипт Gnuplot для цикла внутри или добавления к существующему графику

В частности:

создайте файл simloop.gp, который выглядит следующим образом:

count  = count+1
#save the count to count.gp
system 'echo '.count.' > count.gp'
#load the simloop shell
system "./simloop.sh"

#draw the arrow
load 'draw_arrow.gp'

if(count<max) reread

Затем создайте файл simloop.sh, который выглядит примерно так

#!/bin/bash

#read the count
count=$(awk -F, '{print $1}' count.gp)
#read the file
xcoord=$(awk -v count=$count -F, 'BEGIN{FS=" ";}{ if(NR==count) print $1}' simulation.dat)
ycoord=$(awk -v count=$count -F, 'BEGIN{FS=" "}{ if(NR==count) print $2}' simulation.dat)
dir=$(awk -v count=$count -F, 'BEGIN{FS=" "}{ if(NR==count) print $3}' simulation.dat)

#choose the direction of the arrow
if [ \"$dir\" == \"0\" ]; then
    echo '' > draw_arrow.gp
fi

if [ \"$dir\" == \"1\" ]; then
  echo 'set arrow from ' $xcoord' ,0 to '$xcoord','$ycoord' head' > draw_arrow.gp
fi

if [ \"$dir\" == \"2\" ]; then
 echo 'set arrow from '$xcoord',0 to '$xcoord','$ycoord' backhead' > draw_arrow.gp
fi

Затем создайте файл Simulation.gp, который будет выглядеть примерно так:

count = 0;
max = 5;
load "simloop.gp"
set yrange[0:*]
plot "simulation.dat" u 1:2 w l

Убедитесь, что у файла оболочки есть права на исполняемый файл (chmod + wrx simloop.sh), загрузите gnuplotи наберите

load "./simulation.gp"

Это сработало для меня с файлом данных

1  99   0
2  92.7 1
3 100.3 2
4 44.2  0
5 71.23 1

(Для тестирования я избавился от форматирования времени. Вы сможете вернуть его без особых проблем)..)

Тогда я получил этот график:enter image description here

Что, я думаю, более или менее то, что вы хотите.

3 голосов
/ 27 января 2011

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

set arrow xval1,yval1 to xval2,yval2

Вы также можете использовать относительные стрелки

set arrow xval1,yval1 rto 1,0

Это нарисует горизонтальную стрелку от xval1, yval1 до (xval1 + 1), yval1

Есть множество опций, связанных с командой set arrow :

1 голос
/ 30 августа 2013

Хотя вопрос довольно старый, вот мой ответ.

Можно использовать стиль печати vectors, который может использовать переменные стили стрелки в зависимости от значения столбца:

set style arrow 1 backhead
set style arrow 2 head
set yrange[0:*]
set xdata time
set timefmt "%Y/%m/%d"
plot "simulation.dat" using 1:2 with line,\
     "" using 1:2:(0):(-$2):($3 == 0 ? 1/0 : $3) with vectors arrowstyle variable

Если значение столбца равно 1/0, точка считается неопределенной и пропускается.

...