Gnuplot, мультиплотные оси, изолинии в одном направлении - PullRequest
3 голосов
/ 13 апреля 2020

Я попытался воспроизвести изображение, показывающее распределение интенсивности поперечных электромагнитных мод c (TEM) с параметрами m и n . Я использовал мультиплотную матрицу 4х4 для поверхностных графиков. Результат меня устраивает. Просто для полноты:

  1. Как бы вы добавили оси вместо отдельного заголовка для каждого отдельного графика?
  2. Есть ли способ отобразить изолинии на поверхности только в одном направлении, как на оригинальном изображении?
  3. Автор оригинала исключил нижнюю часть мультиплота, чтобы подчеркнуть симметрию. Я не уверен, действительно ли это проясняет суть. Я должен просто показать полную матрицу или вы можете придумать лучший способ?

template image

Решение

Спасибо всем , С вашими предложениями у меня теперь есть следующее изображение:

current state with scaling axes and colors

Который выводится через терминал Qt для следующего кода:

m=n=3           # max. 3
THETA=2.5

set hidden3d trianglepattern 2 
set isosamples 50
set xrange [-THETA:THETA]
set yrange [-THETA:THETA]
set view 70,55,,.5
unset border
unset key
unset tics

H0(x)=1
H1(x)=2*x
H2(x)=4*x**2-2
H3(x)=8*x**3-12*x

set multiplot layout n+1,m+1 upwards margins .14,.9,.14,.9 spacing .05 \ 
        title 'Intensitätsverteilungen der Laguerre-Gauß-Moden' font ",16"
do for [i=0:n] for [j=0:m] { 
        eval sprintf("splot (H%d(sqrt(2)*y)*exp(-y**2))**2\
                          * (H%d(sqrt(2)*x)*exp(-x**2))**2\
                                with lines lc %d", i, j, abs(i-j)+1)
}
set origin 0,0
set size 1,1
unset margins
set title ' '
set arrow from 0,-.5 to graph 1,0
set arrow from -.5,0 to graph 0,1
set label at .5, .5 "dreh-\nsymmetrisch" center rotate by -37
set arrow from .7,0 to .1,.6
set tics out nomirror
set xtics 0, 1, n
set ytics 0, 1, m
set xrange [-.5:n+.5]
set yrange [-.5:m+.5]
set xlabel offset graph .5,0 "n"
set ylabel offset graph 0,.5 "m" norotate
plot NaN
unset multiplot
  1. Вместо того чтобы вручную добавлять оси, я нанес на карту точно масштабированный двухмерный график. Таким образом, оси масштабируются для параметров m и n , отличных от 3. Для поддержки более высоких порядков необходимо добавить соответствующие полиномы Эрмита Hn (x); n = 1, 2, 3, ... и, возможно, потребуется настроить поля мультиплота.
  2. Подача set hidden3d trianglepattern 2 оказалась самым простым способом отображения изолиний только в одном направлении. .
  3. Цвета должны помочь определить пары симметричных фигур c. Можно поспорить об эстетике, но мы надеемся, что сообщение будет передано.

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

Попробуйте следующее и настройте его под свои нужды. Безусловно, есть место для улучшений.

в 1. используйте несколько полей для мультиплота и рисуйте линии с помощью стрелок и меток, которые необходимо настроить.

до 2. поместите данные в Блок данных и нанесите на карту with zerrorfill (см. help zerrorfill)

до 3. Я бы сказал, что это вопрос вкуса. Почему автор показывает только TEM01, чтобы иметь только один пример? Почему не отображаются все?

Код:

### isolines only in one direction
reset session
# set term wxt size 900,950   # or some other terminal and sizes

unset key
unset tics
set border 0
set view 55,55,1.0,0.5

set style fill solid 0.0
do for [i=1:99] {
    set linetype i lw 0.5 lc rgb "black"
}

THETA=2.5
set xrange [-THETA:THETA]
set yrange [-THETA:THETA]

H0(x)=1
H1(x)=2*x
H2(x)=4*x**2-2
H3(x)=8*x**3-12*x

m=n=3
set multiplot layout n+1,m+1 upwards \
    title 'Intensitätsverteilungen der Laguerre-Gauß-Moden' \
    margins screen 0.1, screen 0.95, screen 0.15, screen 0.9

    do for [i=0:n] for [j=0:m] {
    #    if (i >= j || i == 0 && j == 1) {   # uncommenting this line skips TEM02,03,12,13,23 
            # eval sprintf("set title 'TEM_{%d%d}'", i, j)    # uncomment to show title
             eval sprintf("f(x,y) = (H%d(sqrt(2)*y)*exp(-y**2))**2 \
                              * (H%d(sqrt(2)*x)*exp(-x**2))**2", i, j)
            # data to datablock
            set print $Data
                c=20.0
                do for [iii=-c:c] {
                    do for [jjj=-c:c] {
                        x=iii/c*THETA
                        y=jjj/c*THETA
                        print sprintf("%g %g %g",x,y,f(x,y))
                    }
                print ""  # add empty line
                print ""  # add empty line
                }
            set print
            splot $Data using 1:2:3:(0):3 with zerrorfill 

    #    } else { set multiplot next }      # uncommenting this line skips TEM02,03,12,13,23 

    }
    unset title

    # arrows and labels 
    A1x0=0.16; A1x1=0.95; A1y=0.05;  A1grid=0.225
    A2x=0.05;  A2y0=0.20; A2y1=0.95; A2grid=0.20
    TicL=0.01
    set arrow 1 from screen A1x0,A1y to screen A1x1,A1y lw 3
    set label 1 "n" at screen A1x1,A1y offset 0,-1 font ",14"
    set arrow 2 from screen A2x,A2y0 to screen A2x,A2y1 lw 3
    set label 2 "m" at screen A2x,A2y1 offset -4,0 font ",14"
    do for [i=0:3] {
        set label i+3 sprintf("%d",i) at screen A1x0+i*A1grid,A1y offset -0.7,-1.5 font ",14"
        set arrow i+3 from screen A1x0+i*A1grid,A1y to screen A1x0+i*A1grid,A1y-TicL lw 2 nohead
        set label i+7 sprintf("%d",i) at screen A2x,A2y0+i*A2grid offset -4,0 font ",14"
        set arrow i+7 from screen A2x,A2y0+i*A2grid to screen A2x-TicL,A2y0+i*A2grid lw 2nohead
    }
    plot NaN   # plot nothing but to add the arrows and labels
unset multiplot
### end of code

Результат:

enter image description here

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

Что касается вашей точки 2 (изолинии в одном направлении), я обнаружил, что участок ограждения с помощью zerrorfill может это сделать:

w = 2.5
set xrange [-w:w]
set yrange [-w:w]
set view 55,55,1.
set ticslevel 0

H1(x) = 2*x
H2(x) = 4*x**2-2
f(x,y) = (H2(sqrt(2)*y)*exp(-y**2))**2\
                          * (H1(sqrt(2)*x)*exp(-x**2))**2

splot for [i=-25:25] '+' us (y=i/10.):1:(z=f(x,y)):(0):(z) w zerrorfill  fc "white" lc "black" t ""

Менее приятной была моя первая попытка:

set hidden3d
w = 2.5
set xrange [-w:w]
set yrange [-w:w]
set view 55,55,1.
set ticslevel 0

set iso 100,200
set palette defined (0 "white", 1 "black")
set cbrange[0:1]

H1(x) = 2*x
H2(x) = 4*x**2-2
f(x,y) = (H2(sqrt(2)*y)*exp(-y**2))**2\
                          * (H1(sqrt(2)*x)*exp(-x**2))**2

splot '++' us 1:2:(f(x,y)-0.05):(0) w l palette, i=0,\
      "++" us 1:2:(i=i+1, f(x,y)/(i%2==0)):(1) w l palette

enter image description here Первый объект сюжета заботится о скрытой части и просто белый. Второй сюжетный объект имеет черные линии; деление с помощью (i%2==0) создает nan s для каждой второй строки, давая подавленные линии в одном направлении.

0 голосов
/ 16 апреля 2020

Спасибо всем. Я добавил решение прямо под моим вопросом.

...