Как установить линии сетки (вектор или стрелки) в gnuplot - PullRequest
0 голосов
/ 29 мая 2020

Расположение линий сетки (параллельно оси Y) по оси X определяется в третьей строке файлов, например, третьи линии имеют точки.

#   0.00000000 0.08329780 0.11683890 0.20013670 0.23367770 

Я могу получить Ymax из другого файла, определенного как FILE с

set table $Dummy
plot FILE u ($0==1?(Ymax=$2): NaN) w table # i have updated this line. This will be used only for height of the grid line. Here FILE is a data file with two coloum only which will be plotted in X-Y format.

unset table

Как я могу установить линии сетки в указанных выше местах, которые должны заканчиваться на Ymax?

Мне нужно что-то вроде:

for i in 0.00000000 0.08329780 0.11683890 0.20013670 0.23367770
do
set arrow $i, Ymax lc rgb "black" dt 2 nohead 
done

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Как уже отмечал @Ethan, линии сетки привязаны к основным или второстепенным тикам и охватывают весь граф. Но вы можете построить что-то with vectors.

Кстати, обратите внимание, что с вашим кодом

set table $Dummy
    plot FILE u ($0==1?(Ymin=$1,Ymax=$2):NaN,Xmax=$8) w table
unset table

Ymin и Ymax будут значениями первого и второго столбец второй строки (строки) набора данных last . Если в ваших данных нет пустых строк, то последний набор данных также является первым. Xmax будет общим последним значением 8-го столбца.

Для вашей задачи одно решение может быть следующим ниже. Нет необходимости в sed или awk, et c. Поскольку у меня нет примеров данных от вас, я предполагаю кое-что.

  1. получить позиции x для ваших «линий сетки» из одного файла данных
  2. извлечь Ymin,Ymax,Xmax из другого файла данных
  3. нанесите ваши данные with linespoints и «линии сетки» with vectors

Обратите внимание, что в более ранних версиях gnuplot было ограничение strcol() до (я думаю) 63 символов . В gnuplot 5.2.7 это было исправлено.

Код:

### use vector plot to plot "grid lines"
reset session

$Data1 <<EOD
# first line
# second line
# 0.00000000 0.08329780 0.11683890 0.20013670 0.23367770
# below this line data starts
1  4
2  5
3  6
EOD

$Data2 <<EOD
1.1  2.7  0  0  1.2  0  0  0.00
1.2  2.6  0  0  1.8  0  0  0.05
1.3  2.5  0  0  2.5  0  0  0.10
1.4  2.4  0  0  2.1  0  0  0.15
1.5  2.3  0  0  1.6  0  0  0.17
1.6  2.2  0  0  1.7  0  0  0.20
1.7  2.1  0  0  2.4  0  0  0.25
EOD

set table $Dummy
    set datafile commentschars ''       # all lines will be data line
    set datafile separator '\n'         # in order to get full lines
    plot $Data1 u (xValues = strcol(1)) index 0 every ::2::2 w table   # get the complete 3rd line
    set datafile commentschars '#'      # reset the comment character
    set datafile separator whitespace   # reset the column separator
    plot t=0 $Data2 u (t==0?(Ymin=$1,Ymax=$2,t=1):NaN,Xmax=$8) w table  # get Ymin,Ymax,Xmax
unset table
print Ymin, Ymax, Xmax, xValues

xValue(n) = real(word(xValues,n+1))   # function to extract xValue

set xrange[-0.05:0.3]
set samples words(xValues)-1    # set number of datapoints of special datafile '+'

plot '+' u (xValue(int($0+1))):(Ymin):(0):(Ymax-Ymin) w vectors lc rgb "black" dt 2 nohead not, \
     $Data2 u 8:5 w lp pt 7 lc rgb "red" title "Data"
### end of code

Результат:

enter image description here

Дополнение:

Выше я показал вам, как извлечь необходимые значения с помощью gnuplot. Да, это не так просто для понимания и не самый короткий путь, но это только gnuplot ! Если вы предпочитаете использовать sed, awk или тому подобное, не стесняйтесь, но здесь я ничем не могу помочь.

Другой подход вместо построения векторов - рисование стрелок. Предполагается, что у вас уже есть данные в переменных.

Код:

### draw arrows from a data string
reset session

xValues = "0.00000000 0.08329780 0.11683890 0.20013670 0.23367770"

Ymin = 0.2
Ymax = 0.9
Xmax = 0.25

i=0
do for [xValue in xValues] {
    i=i+1
    set arrow i from xValue,Ymin to xValue,Ymax nohead dt 2
}

set xrange[-0.05:0.4]
set yrange[0:1]

plot x
### end of code

Результат:

enter image description here

1 голос
/ 29 мая 2020

Линии сетки размещаются в точках деления оси. Основные тики (тиковый уровень 0) и второстепенные тики (тиковый уровень 1) отслеживаются отдельно. Также можно выбрать тип линий сетки. Чтобы сгенерировать тонкие синие вертикальные линии сетки в координатах x, которые вы показываете, используя небольшие отметки для управления линиями сетки:

  set xtics add ( 0.00000000 1, 0.08329780 1, 0.11683890 1, 0.20013670 1, 0.23367770 1 )
  set grid mx lt 0, lt 1 lw 0.5 lc "blue"

Как всегда, см. Документацию (справка установить xtics, справку установить сетку) для получения дополнительных сведений.

...