Постройте полосу ошибок как закрашенную область в GNUPLOT - PullRequest
2 голосов
/ 16 июня 2020

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

#!/usr/bin/gnuplot
reset
set border lw 30
set term pngcairo size 10000,10000 font "arial-Bold,130"
set output 'out.png'
unset key
set size ratio 1.2
set style data lines
set xtics format ""
set x2tics nomirror
set ytics out nomirror
set ytics 0,20 
set x2label "Vs (km/s)" offset -1.0
set ylabel 'Depth (km)' offset 1.5
set xrange [2.5:4.8]
set yrange [314:0]
set label 3 at 2,120
set key samplen 1.7 at 3.0,135
#
set label 1 '(a)' font "arial-Bold,130" at 0.8,15 right 
set label 3 "C3 (MNAI)" center font "arial-Bold,130"
set style fill transparent solid 0.25
set style fill noborder

plot 'MAN.inmd' lc rgb 'blue' lw 35 title "Initial  model"   with fsteps,\
     'MAN.outmd' using 1:2 lc rgb 'red' lw 35  dt"-" title "Inverted model" with fsteps ,\
     'MAN.outmd' using 1:($2-$3):($2+$3) with filledcurve lc "blue" notitle, 

Пример данных для файла MAN.outmd XYZ (Ошибка)

0        3         0
0.4475   3.1       0
0.4475   3.5       0
2.6738   3.6       0.0552
2.6738   5         0.0552
3.8441   5.1       0.0592
3.8441   8         0.0592
3.6302   8.1       0.0395
3.6302   15.935    0.0395
4.5176   15.1      0.041
4.5176   113.296   0.041
4.2443   113.3     0.1024
4.2443   214       0.1024
4.4584   214.1     0.1077
4.4584   314       0.1077

enter image description here

Я хочу, чтобы результат был таким, как показано ниже (пример)

enter image description here

1 Ответ

0 голосов
/ 20 июня 2020

gnuplot может легко заполнить область между двумя «горизонтальными» кривыми (т.е. уникальными значениями x), но, насколько мне известно, не между двумя вертикальными кривыми. Однако gnuplot может заполнять некоторые замкнутые области. Таким образом, обходной путь - создать точки данных, которые окружают область, которую нужно затенять. Для этого вы «наносите» данные в блок данных, один раз «вперед» с помощью x-dx и один раз «назад» с помощью x+dx. Проще всего это сделать, если у вас уже есть данные в блоке данных, потому что тогда вы можете легко перемещать oop данные вперед и назад. Если у вас есть данные в файле, см. Здесь: gnuplot: загрузить файл данных 1: 1 в блок данных

Код:

### fill between vertical curves
reset session

$Data <<EOD
0        3         0
0.4475   3.1       0
0.4475   3.5       0
2.6738   3.6       0.0552
2.6738   5         0.0552
3.8441   5.1       0.0592
3.8441   8         0.0592
3.6302   8.1       0.0395
3.6302   15.935    0.0395
4.5176   15.1      0.041
4.5176   113.296   0.041
4.2443   113.3     0.1024
4.2443   214       0.1024
4.4584   214.1     0.1077
4.4584   314       0.1077
EOD

# create datablock with circumference of shaded area
set print $XErrorFill
    do for [i=1:|$Data|] {
        print real(word($Data[i],1))-real(word($Data[i],3)), real(word($Data[i],2))
    }
    do for [i=|$Data|:1:-1] {
        print real(word($Data[i],1))+real(word($Data[i],3)), real(word($Data[i],2))
    }
set print

set yrange [:] reverse
set style fill noborder

plot $XErrorFill u 1:2 w filledcurves lc "light-grey" notitle, \
     $Data u 1:2 w l lw 1.5 lc rgb "red" notitle
### end of code

Результат:

введите описание изображения здесь

...