Gnuplot: для построения точки нужно значение из файла - PullRequest
0 голосов
/ 19 апреля 2020

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

  Index  Value
  1       5.1
  2       5.3 
  3       5.6

Я строю гистограмму для каждого индекса и делаю GIF со всеми из них. Стрелка будет:

set arrow from 'value_index',0 length 0.5 angle 90 nohead

Мой вопрос: как мне получить доступ к значению с нужным мне индексом?

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Вы можете использовать троичный оператор (отметьте help ternary), чтобы извлечь ваше значение при построении линии with vectors и повторно использовать значение в легенде с keyentry. Ниже приведен минимальный пример, который вы можете адаптировать к вашим потребностям.

Код:

### extract value from a dataset (or file)
reset session

$Data <<EOD
  Index  Value
  1       5.1
  2       5.3 
  3       5.6
EOD

# Gauss curve by specifing Amplitude A, position x0 and width via FWHM
GaussW(x,x0,A,FWHM) = A * exp(-(x-x0)**2/(2*(FWHM/(2*sqrt(2*log(2))))**2))

set xrange[0:10]
set samples 30
set style line 1 lc rgb "red" lw 1.5
set key top left samplen 1.5

set multiplot layout 1,3
    Index = 1
    plot GaussW(x,5.4,0.4,2.5) w boxes ti "Histogram", \
         $Data u ($1==Index?Value=$2:NaN):(0):(0):(0.5) w vectors ls 1 nohead notitle, \
         keyentry w l ls 1 ti sprintf("%g",Value)
    Index = 2
    plot GaussW(x,5.4,0.4,2.5) w boxes ti "Histogram", \
         $Data u ($1==Index?Value=$2:NaN):(0):(0):(0.5) w vectors ls 1 nohead notitle, \
         keyentry w l ls 1 ti sprintf("%g",Value)
    Index = 3
    plot GaussW(x,5.4,0.4,2.5) w boxes ti "Histogram", \
         $Data u ($1==Index?Value=$2:NaN):(0):(0):(0.5) w vectors ls 1 nohead notitle, \
         keyentry w l ls 1 ti sprintf("%g",Value)
unset multiplot
### end of code 

Результат:

enter image description here

1 голос
/ 19 апреля 2020

Если у вас есть доступ к sed, вы можете прочитать указанный c номер строки с помощью sed -n Np value_index, где N - номер строки. Номера строк начинаются с 0, а не с 1. Затем вы можете использовать функцию word в gnuplot, чтобы извлечь из этой строки второе "слово", разделенное пробелами.

Index = 2
line = system(sprintf("sed -n %dp 'value_index'", Index+1))
Value = word(line, 2)
print Value

С чистым gnuplot это немного сложнее но все еще выполнимо. Ключевая часть - using 1:(2, Value=$2), что эквивалентно using 1:2, но также хранит значение второго столбца в Value. every ::(Index)::(Index) сообщает gnuplot о считывании файла с номера строки Index до номера строки Index (так что это всего одна строка).

Index = 2
set xrange [0:1] # To avoid warnings about empty range.
set yrange [0:1]
set table $temp # To avoid plotting anything.
plot 'value_index' using 1:(2, Value=$2) every ::(Index)::(Index)
unset table
print Value
...