Гнуплот ориентированные стрелки на точках - PullRequest
0 голосов
/ 06 ноября 2018

Чтобы нарисовать скорость ветра в направлении, я пытаюсь найти способ нарисовать кривую скорости ветра, где каждая точка будет стрелкой, ориентированной в направлении ветра.

Первое решение, которое я нашел, состоит в том, чтобы построить векторы, которые работают очень хорошо, но я сохраняю стандартные оси.

Данные:

#Steps Speeds m/s Directions °

0 3.2 56

с этой командой

plot 'file.dat' using 1:2:(cos($3)):(sin($3)) with vectors head filled lt 2

Я получаю вектор в каждой точке с направлением ветра.

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

Кто-то видит проблему, есть идеи решения. В абсолютном выражении я хотел бы, чтобы каждое или некоторое значение точки отображалось как ориентированная стрелка.

Спасибо

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

вот код, который я сделал,

    # Setting xdata to time.
set xdata time
set timefmt "%Y-%m-%d-%H:%M"

# set format x controls the way that gnuplot displays the dates on the x axis.
# "%Y-%m-%d" is the same as "%F", but "%F" applies to output only; it won't work
# for timefmt, which controls data reading.
set format x "%H:%M"

set xrange ["2018-10-23-06:00":"2018-10-23-19:00"]
#set yrange [0:12]

FILE="history_export_2018-11-06T13_23_09.dat"

set angles degrees
set grid mxtics mytics xtics ytics
set key outside  bmargin left spacing 1.8
set key maxrows 1
set ylabel 'Vitesse [Klm/s]'
set xlabel 'Temps [hh:mm]'
#set title "Simple Plots" 
set title  font "Arial,20" norotate
LEN=1.8

plot FILE using 1:3 with lines          # just to get the scaling
SCALE = (GPVAL_X_MAX - GPVAL_X_MIN) / (2*(GPVAL_Y_MAX - GPVAL_Y_MIN))
#SCALE = (GPVAL_X_MAX - GPVAL_X_MIN) / (2*(GPVAL_Y_MAX - GPVAL_Y_MIN)) * (GPVAL_TERM_YMAX - GPVAL_TERM_YMIN) / (GPVAL_TERM_XMAX - GPVAL_TERM_XMIN) * GPVAL_TERM_XSIZE / GPVAL_TERM_YSIZE
plot FILE using 1:3:(LEN*cos($4)*SCALE):(LEN*sin($4)) with vectors head filled lc 7 title"Directions" ,\
    FILE using 1:3 smooth csplines  title "Vitesse",\
    FILE using 1:5 smooth csplines t "Rafale"

А вот некоторые данные

#Year-Month-Day-Hour:Minute Temperature  [2 m above gnd] Wind Speed  [10 m above gnd] Wind Direction  [10 m above gnd] Wind Gust  [sfc]
    2018-10-23-00:00 8.62 16.26 354.92 21.96
    2018-10-23-01:00 7.91 15.19 354.56 222.32
    2018-10-23-02:00 7.26 14.80 355.82 27.00
    2018-10-23-03:00 6.51 12.78 350.27 18.00
    2018-10-23-04:00 8.24 18.06 355.43 23.40
    2018-10-23-05:00 8.21 15.94 353.52 23.04
    2018-10-23-06:00 8.15 14.92 351.67 21.60
    2018-10-23-07:00 8.15 14.44 355.71 25.56
    2018-10-23-08:00 8.24 15.50 357.34 26.64
    2018-10-23-09:00 8.70 17.64 360.00 28.08
    2018-10-23-10:00 10.08 17.64 360.00 27.36
    2018-10-23-11:00 12.79 18.37 2.25 24.84
    2018-10-23-12:00 15.43 23.44 3.52 28.44
    2018-10-23-13:00 16.59 23.86 255.19 29.88
    2018-10-23-14:00 17.32 23.08 93.58 28.08
    2018-10-23-15:00 17.75 23.08 3.58 28.08
    2018-10-23-16:00 17.64 21.97 1.88 27.00
    2018-10-23-17:00 16.55 18.75 3.30 25.20
    2018-10-23-18:00 13.04 13.00 4.76 27.36
    2018-10-23-19:00 11.45 10.90 352.41 25.56
    2018-10-23-20:00 10.21 11.12 330.95 25.56
    2018-10-23-21:00 9.14 11.98 327.26 26.64
    2018-10-23-22:00 8.48 12.90 337.01 29.88
    2018-10-23-23:00 7.99 12.25 335.70 31.32

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

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

Спасибо за советы, но когда я положил голову, это ничего не меняет.

enter image description here

Вот что я получаю с LEN = 0,4

LEN=0.4

set style arrow 1 head fixed filled size screen 0.03,15,135 ls 1

plot FILE using 1:3 with lines          # just to get the scaling
#SCALE = (GPVAL_X_MAX - GPVAL_X_MIN) / (2*(GPVAL_Y_MAX - GPVAL_Y_MIN))
SCALE = (GPVAL_X_MAX - GPVAL_X_MIN) / ((GPVAL_Y_MAX - GPVAL_Y_MIN)) * (GPVAL_TERM_YMAX - GPVAL_TERM_YMIN) / (GPVAL_TERM_XMAX - GPVAL_TERM_XMIN) * GPVAL_TERM_XSIZE / GPVAL_TERM_YSIZE
plot \
    FILE using 1:3:(LEN*cos($4-180)*SCALE):(1.5*LEN*sin($4-180)) with vectors arrowstyle 1  title"Directions" ,\
    FILE using 1:3 smooth csplines  title "Vitesse",\
    FILE using 1:5 smooth csplines t "Rafale"

А этот с LEN = 0.2 enter image description here

Может быть, я делаю что-то не так, но мне нравится первое, и похоже, что я хочу сделать.

Спасибо, ребята

0 голосов
/ 06 ноября 2018

График один раз для загрузки переменных состояния GPVAL_*. Затем выполните реплотирование, используя масштабированные значения для стрелок xdelta и ydelta. Возможно, вам нужна дополнительная коррекция, чтобы стрелки были разумного размера. Зовите это ЛЕН.

plot 'file.dat' using 1:2 with points          # just to get the scaling
SCALE = (GPVAL_X_MAX - GPVAL_X_MIN) / (GPVAL_Y_MAX - GPVAL_Y_MIN)
plot 'file.dat' using 1:2:(LEN*cos($3)*SCALE):(LEN*sin($3)) with vectors
...