Контур по трехмерному графику, два разных диапазона данных - PullRequest
1 голос
/ 14 июля 2020

Я хотел бы построить трехмерный график одного набора данных и изолинить другой набор данных в виде единого комбинированного графика. (Набор данных изолиний связан с градиентами 3D графика, для тех, кому интересно). Адаптированный код отсюда работает нормально, за исключением одного: если я использую set zrange для масштабирования моего 3D-графика, контуры исчезают. 3D-график с автоматическим выбором диапазона выглядит не очень хорошо, хотя контуры тогда выглядят нормально, поэтому я хотел бы применить настраиваемый диапазон. Я подозреваю, что проблема как-то связана с ранжированием контуров, при котором контуры не остаются. Но у меня недостаточно опыта работы с Gnuplot, чтобы понять, так ли это на самом деле или как решить проблему.

Этот код ...

    reset
    set ztics 5
    #set zrange [10 : 25] #nowriteback
    set view 135,60
    set contour base #surface
    set cntrlabel font ",7"
    set datafile missing "NaN"
    set clabel
    
    set cntrparam levels discrete 0.3, 0.4, 0.6, 1.0, 1.5
    splot 'out011_Io.txt' nonuniform matrix with lines notitle nocontour, \
    'out011_FlxN.txt' nonuniform matrix with lines title "{/Symbol F}_{N}" enhanced nosurface

... создает это plot: чрезмерно сплющенный трехмерный график с правильными контурами ,

while activating the zrange...

reset
set ztics 5
set zrange [10 : 25] #nowriteback
set view 135,60
set contour base #surface
set cntrlabel font ",7"
set datafile missing "NaN"
set clabel

set cntrparam levels discrete 0.3, 0.4, 0.6, 1.0, 1.5
splot 'out011_Io.txt' nonuniform matrix with lines notitle nocontour, \
'out011_FlxN.txt' nonuniform matrix with lines title "{/Symbol F}_{N}" enhanced nosurface

...creates this plot: good 3D plot, no visible contours.

enter image description here

Original data can be found here: out011_FlxN.txt и out011_Io.txt

Приветствуются предложения от более знающих людей.

Ответы [ 2 ]

1 голос
/ 16 июля 2020

Если вы отметите help contour, gnuplot предлагает варианты построения контура

set contour {base | surface | both}

К сожалению, не на настраиваемом уровне, как вы просили. Итак, мое предложение по обходному пути будет следующим:

  1. нанесите данные и контур в таблицу, например блок данных $Cont. Этот блок данных будет содержать данные и контурные линии (в вашем случае 5) и каждый подблок, разделенный двумя пустыми строками.
  2. неустановленный контур
  3. график $Cont, но кроме первого блок. В вашем случае через index 1:5.

Объяснение:

for [i=1:LevelCount] $Cont u 1:2:(10):(column(-2)) index i w l lc var ti columnhead(3) 

Построение блоков с 1 по 5 из $Cont на постоянном z-уровне (10) с использованием переменной цвет lc var определяется псевдостолбцом (column(-2)) с ключевым заголовком columnhead(3). Судя по всему, в вашем случае контурных линий всего 4, т.е. ни одной в 0.3.

Код:

### contour plot at custom level
reset session

set contour base
set cntrparam levels discrete 0.3, 0.4, 0.6, 1.0, 1.5
set table $Cont
    splot "out011_FlxN2.txt" nonuniform matrix
unset table
unset contour
 
set key at screen 0.16, screen 1 title "{/Symbol F}_{N}"
set view 135,60
set xyplane relative 0
LevelCount = 5

splot "out011_Io.txt" nonuniform matrix w l notitle, \
      for [i=1:LevelCount] $Cont u 1:2:(10):(column(-2)) index i w l lc var ti columnhead(3) 
### end of code

Результат:

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

0 голосов
/ 14 июля 2020

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

set cntrparam levels discrete -.5,.5
set contour base
splot 10*(sin(x/3)*sin(y/3)+2), sin(x/3)*sin(y/3) nosurface

действительно создает контуры, но и там, если вы укажете zrange, который не включает -0.5 и, возможно, 0.5, эти контуры не отображаются. Поскольку для splot нет ключевого слова axes (в отличие от plot), насколько мне известно, у вас остались уловки, позволяющие подогнать данные во втором файле в диапазон данных 1-го . Поскольку диапазон 1-го составляет [10:25], а диапазон второго [0.3:1.5], добавление 10 хорошо. Но тогда вам придется изготовить ключ «вручную», иначе контуры будут помечены 10.3, 10.4,.... Вот исправленный код:

reset
set ztics 5
set zrange [10 : 25] #nowriteback
set view 135,60
set contour base #surface
set cntrlabel font ",7"
set datafile missing "NaN"
set clabel

NSURFACES=1 #change if plotting more surfaces
SHIFT=10
LEVELS="10.3, 10.4, 10.6, 11.0, 11.5"
set cntrparam levels discrete @LEVELS
set style line 100 lc rgb "white"
splot 'out011_Io.txt' nonuniform matrix with lines notitle nocontour, \
  'out011_FlxN.txt' nonuniform matrix using 1:2:($3+SHIFT) with lines notitle enhanced nosurface, \
  for [i=0:words(LEVELS)] 1/0 w l ls (i==0)?100:i+NSURFACES  title (i==0)?"{/Symbol F}_{N}":sprintf(("%.1f"),word(LEVELS,i)-SHIFT)

NB:

  1. Более чистым решением было бы использовать stats на обоих и вычислить, какое смещение должно быть добавлено во второй файл, а чем при жесткой настройке 10.
  2. Начиная с версии 5.2, вы можете заменить 1/0 ключевым словом keyentry для очистки.
...