Gnuplot:使 pm3d 调色板在超出范围时重复
Gnuplot: Making pm3d palette repeat when out of range
计划是使用 pm3d 映射和连续的重复 color-palette 绘制二维复函数的相位。更具体地说,调色板仅在 [-pi, pi] 上定义,而相位本身可能 运行 超出此范围。 color-palette 应重复这些值。
我目前的尝试是通过减去或增加 2*pi 的倍数来强制函数保持在范围内并在跨越边界时从另一侧重新开始。
然而,每当函数中出现这样的 phase-jump 时,就会产生伪影。注意图中的 blue-ish pixel-rings:
这是用于生成此图的代码:
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
当插值发生时出现伪影是有道理的,但这当然不是我想要的。
有没有办法通过重复 color-patterns 来创建漂亮的二维绘图?
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
计划是使用 pm3d 映射和连续的重复 color-palette 绘制二维复函数的相位。更具体地说,调色板仅在 [-pi, pi] 上定义,而相位本身可能 运行 超出此范围。 color-palette 应重复这些值。
我目前的尝试是通过减去或增加 2*pi 的倍数来强制函数保持在范围内并在跨越边界时从另一侧重新开始。 然而,每当函数中出现这样的 phase-jump 时,就会产生伪影。注意图中的 blue-ish pixel-rings:
这是用于生成此图的代码:
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
当插值发生时出现伪影是有道理的,但这当然不是我想要的。
有没有办法通过重复 color-patterns 来创建漂亮的二维绘图?
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