Automati c смещение в гнуплоте - PullRequest
1 голос
/ 21 апреля 2020

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

Следовательно, я хочу сместить ось Y, чтобы эти колебания были четко видны. Для этого я использую что-то вроде set offsets 0,0,0,0.1. Но на самом деле я написал bash скрипт для генерации сюжета для меня. Мне просто нужно указать имя файла данных. Поэтому для каждого графика я не хочу вводить go в скрипт и вручную устанавливать значение смещения на основе данных.

Я хотел бы, чтобы смещение определялось gnuplot автоматически на основе размер на оси, как и смещение, составляет 1 * размер ячейки. Так что моя команда может выглядеть так:

set offsets 0,0,0,1*$bin_size

Есть ли способ добиться этого?

Редактировать:

Это скрипт, который я использую.

#!/bin/bash

#Requires that the script be in the same directory as the data files
#sed -n '3001,4000p' fish_data_re.dat > fish_data_re_3k_4k.dat : Can be used to extract data from specific range in data file

DATA_FILE_NAME="abc"
DATA_FILE_TYPE="dat"


#Code to generate normalised files
awk 'NR == FNR {if(max < $2) {max = $2}; next} {$2 = $2 / max; printf "%f\t%f\n", $1, $2}' $DATA_FILE_NAME.$DATA_FILE_TYPE $DATA_FILE_NAME.$DATA_FILE_TYPE > $DATA_FILE_NAME\_normed.$DATA_FILE_TYPE

DATA_FILE_NAME="$DATA_FILE_NAME\_normed"
DATA_FILE_TYPE="dat"

OUTPUT_FILE_TYPE="eps"
OUTPUT_FILE_NAME="$DATA_FILE_NAME\_plot.$OUTPUT_FILE_TYPE"

X_LABEL="Time"
Y_LABEL="Real Classical Fisher Information"
TITLE="Real Classical Fisher Information vs Time"

#Set font size for axis tics
X_TICS_SIZE="6"
Y_TICS_SIZE="6"


gnuplot <<- MULTI_LINE_CODE_TAG

set xlabel "$X_LABEL"
set ylabel "$Y_LABEL"

#Following command allows the printing of underscore from name of data file in plot
set key noenhanced

set title "$TITLE" 

set xtics font ", $X_TICS_SIZE"
set ytics font ", $Y_TICS_SIZE"

set xtics nomirror
set ytics nomirror

#set ytics format "%.22g"
set ytics format "%0.s*10^{%L}"
#set xtics format "%t"



set multiplot

#------The big-plot------

set title "$TITLE" 
set offsets 0,0,0,0.01

#Following plots only data from line 1 to line 100
#plot "<(sed -n '1,100p' $DATA_FILE_NAME.$DATA_FILE_TYPE)" u 1:2 notitle w l lc "red" lw 2 
plot "$DATA_FILE_NAME.$DATA_FILE_TYPE" u 1:2 notitle w l lc "red" lw 2

#------The sub-plot------

unset title
unset offsets

set origin 0.25,0.3
set size 0.45,0.45
set xrange [30:60]
set yrange [-0.01:0.01]
unset xlabel
unset ylabel
#unset label

plot "$DATA_FILE_NAME.$DATA_FILE_TYPE" u 1:2 notitle w l lc "red" lw 2

unset multiplot

set term "$OUTPUT_FILE_TYPE"
set output "$OUTPUT_FILE_NAME"

replot

MULTI_LINE_CODE_TAG

exit

Как видите, мне нужно указать смещение вручную.

Вот сюжет, который я получаю.

enter image description here Ось Y здесь смещена на -0,002 -0,2. Я хочу автоматизировать эту вещь и хочу, чтобы gnuplot всегда использовал смещение в качестве размера ячейки (которое я определяю как расстояние между последовательными тиками).

(Если это тривиальный вопрос, я прошу прощения заранее я новичок в gnuplot.)

1 Ответ

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

Полагаю, я до сих пор не понимаю вашей точной проблемы. Кстати, ваше смещение это -200e-3 = -0.2, а не -0.002. Ваши данные всегда между 0 и 1? Вы можете установить смещения в зависимости от графика (отметьте help offsets)

set offsets 0,0,0, graph 0.2

В общем, почему бы не использовать логарифмическую шкалу c? Благодаря этому вы сможете увидеть все мелкие элементы в ваших данных.

Код:

### linear scale vs logarithmic scale
reset session 

# 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))

# create some test data
set xrange[0:100]
set samples 500
set table $Data
    plot '+' u 1:(GaussW($1,5,1,2.5) + GaussW($1,40,7e-3,2) + GaussW($1,47,8e-4,5) + 2e-4) w table
unset table

set multiplot layout 1,2
    set offset 0,0,0, graph 0.2
    set yrange[-0.02:1]
    plot $Data u 1:2 w l title "linear y-scale"

    set logscale y
    set yrange[1e-4:1]
    plot $Data u 1:2 w l title "logarithmic y-scale"
unset multiplot
### end of code

Результат:

enter image description here

...