Построение стрелок с помощью 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
Если вам не нужна стрелка, вы можете попробовать стиль импульсов (с импульсами, а не с линиями) (Если вы все еще хотите, чтобы линии сверху, вы можете построить дважды).
если вы действительно хотите стрелки, то может помочь следующее: он использует цикл 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
(для тестирования я избавился от форматирования времени, которое вы должны можно положить его обратно без особых проблем.)
затем я получил этот график:
что, я думаю, более или менее то, что вы хотите.
хотя этот вопрос довольно старый, вот мой ответ.
можно использовать 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
, точка считается неопределенной и пропускается.