Gnuplot: повторение палитры pm3d, когда она находится вне диапазона

План состоит в том, чтобы построить фазу сложной 2D-функции, используя карту pm3d и повторяющуюся цветовую палитру непрерывным образом. Чтобы быть более конкретным, палитра определена только для [-pi, pi], в то время как сама фаза может выйти за пределы этого диапазона. Цветовая палитра должна повторяться для этих значений.

Моя текущая попытка состояла в том, чтобы заставить функцию оставаться внутри диапазона и начинать заново с другой стороны при пересечении границы, вычитая или добавляя кратные 2 * пи. Это, однако, приводило к артефактам всякий раз, когда в функции происходил такой скачок фазы. Обратите внимание на эти голубоватые пиксельные кольца на графике:

Phaseplot

Это был код, используемый для создания этого графика:

    set pm3d map
    set palette model HSV defined ( 0 0 1 1, 1 1 1 1 )
    set samples 100; set isosamples 100

    set xrange [-4:4]
    set yrange [-4:4]
    set cbrange [-pi:pi]

    set cblabel "Phase"

    phaseCont(u,v) = 2*pi* ((u/4)**2 + (v/4)**2)
    phaseClip(u,v) = phaseCont(u,v) - (floor(phaseCont(u,v)/(2*pi) + 0.5) * 2*pi)

    set terminal png
    set output "phaseplot.png"

    splot phaseClip(x,y) with pm3d

    unset output

Логично, что артефакты появляются по мере интерполяции, но это, конечно, не то, к чему я стремлюсь.

Есть ли способ создавать красивые 2D-графики с повторяющимися цветовыми узорами?


person JCh3ss    schedule 17.10.2017    source источник
comment
Артефакты появляются из-за того, что по умолчанию pm3d выполняет интерполяцию между всеми четырьмя углами четырехугольника. Вы можете подавить это, например. set pm3d corners2color c1. Иначе я бы не знал, как это сделать.   -  person Christoph    schedule 17.10.2017
comment
Да, я так и думал, что это произошло. И спасибо за классный совет с rows2color, который дал желаемый эффект! Не могли бы вы опубликовать этот комментарий как ответ, чтобы я мог отметить его как правильный ответ?   -  person JCh3ss    schedule 17.10.2017


Ответы (1)


Gnuplot не может определять бесконечно повторяющиеся цветовые палитры. В вашем случае мешающая интерполяция исходит из интерполяции pm3d по умолчанию, которая вычисляет среднее значение всех четырех углов для определения цвета (см. show pm3d). Чтобы избежать такого рода интерполяции, используйте, например.

set pm3d corners2color c1

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

set pm3d map
set palette model HSV defined ( 0 0 1 1, 1 1 1 1 )
set samples 500; set isosamples 500

set xrange [-4:4]
set yrange [-4:4]
set cbrange [-pi:pi]
set pm3d corners2color c1

set cblabel "Phase"

phaseCont(u,v) = 2*pi* ((u/4)**2 + (v/4)**2)
phaseClip(u,v) = phaseCont(u,v) - (floor(phaseCont(u,v)/(2*pi) + 0.5) * 2*pi)

set terminal pngcairo
set output "phaseplot.png"

splot phaseClip(x,y) with pm3d

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

person Christoph    schedule 17.10.2017