Построение стрелок с помощью gnuplot

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

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 для создания стрелок на первом участке?

3 ответов


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

set arrow xval1,yval1 to xval2,yval2

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

set arrow xval1,yval1 rto 1,0

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

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


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

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

сценарий Gnuplot, для цикла внутри или добавления к существующему сюжету

в частности:

создать файл симлуп.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 }' count.gp)
#read the file
xcoord=$(awk -v count=$count -F, 'BEGIN{FS=" ";}{ if(NR==count) print }' simulation.dat)
ycoord=$(awk -v count=$count -F, 'BEGIN{FS=" "}{ if(NR==count) print }' simulation.dat)
dir=$(awk -v count=$count -F, 'BEGIN{FS=" "}{ if(NR==count) print }' 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

затем создайте симуляцию.файл 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

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


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

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

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):(-):( == 0 ? 1/0 : ) with vectors arrowstyle variable

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