Gnuplot中splot绘制3D参数曲线:实现跨曲线的离散颜色梯度
我的环境
- Gnuplot版本:5.2 patchlevel 8
- 系统:Windows子系统Linux(Ubuntu 20.04 LTS)
问题描述
刚接触Gnuplot,想给3D空间里的不同参数曲线分配不同颜色,要求颜色是跨曲线的离散渐变(比如10条曲线,每条为纯色,整体构成渐变效果)。
示例轨迹由以下方程定义(单位球面上的轨迹):
x = cos(u) * cos(a*u) y = cos(u) * sin(a*u) z = sin(u)
其中u是范围在-π到π的极角,a为常数。
尝试了以下代码,虽然能生成渐变曲线,但颜色梯度是沿单条曲线方向的,不是跨曲线的离散渐变:
reset set parametric set angle degree set urange [-90:90] set vrange [0:360] set xrange [-1:1] set yrange [-1:1] set zrange [-1:1] set ticslevel 0 set xlabel "x" set ylabel "y" set zlabel "z" set view equal xyz set nokey jmax = 20.0 set for [j=1:jmax] style line j lc palette frac j/jmax lw 2 fx(u,v)=cos(u)*cos(v) fy(u,v)=cos(u)*sin(v) fz(u)=sin(u) a=0.2 splot for [j=1:jmax] fx(u,u*a*j), fy(u, u*a*j), fz(u) ls j # splot for [j=1:jmax] fx(u,u*a*j), fy(u, u*a*j), fz(u) lc palette frac j/jmax
(问题修正:上述代码中最后一行splot并非实际尝试的代码,已注释并添加实际尝试的代码,结果一致,不影响问题本身。)
执行show lines命令输出如下:
gnuplot> show lines linestyle 1, linecolor palette fraction 0.05 linewidth 2.000 dashtype solid pointtype 1 pointsize default linestyle 2, linecolor palette fraction 0.10 linewidth 2.000 dashtype solid pointtype 2 pointsize default ...
看起来调色板比例已按循环设置,但颜色梯度似乎映射到了z轴,求解决方案。
解决方案
问题出在lc palette frac的行为:在参数化3D绘图中,gnuplot会默认将数据点的z值(或第三个参数)映射到调色板,覆盖了你在linestyle中设置的固定颜色比例。要让每条曲线使用纯色,需要直接从调色板中提取固定颜色值,而非依赖动态映射。
修改代码中的linestyle设置,将lc palette frac j/jmax替换为lc rgb palette(j/jmax),这样会直接取调色板对应位置的纯色,而不是让gnuplot根据数据点动态调整颜色。
修改后的完整代码:
reset set parametric set angle degree set urange [-90:90] set vrange [0:360] set xrange [-1:1] set yrange [-1:1] set zrange [-1:1] set ticslevel 0 set xlabel "x" set ylabel "y" set zlabel "z" set view equal xyz set nokey jmax = 20.0 # 改用lc rgb palette()直接获取固定调色板颜色 set for [j=1:jmax] style line j lc rgb palette(j/jmax) lw 2 fx(u,v)=cos(u)*cos(v) fy(u,v)=cos(u)*sin(v) fz(u)=sin(u) a=0.2 splot for [j=1:jmax] fx(u,u*a*j), fy(u, u*a*j), fz(u) ls j
原理说明
palette(frac)函数会返回调色板中对应比例位置的RGB颜色值,用lc rgb指定后,整条曲线会统一使用这个纯色。- 原代码中的
lc palette frac是告诉gnuplot“用调色板,但根据数据点的某个值(默认z轴)来计算比例”,所以会导致单条曲线内部出现颜色渐变。
另外,也可以直接在splot命令中指定颜色,省去linestyle的设置,效果相同:
splot for [j=1:jmax] fx(u,u*a*j), fy(u, u*a*j), fz(u) lc rgb palette(j/jmax) lw 2
内容的提问来源于stack exchange,提问作者atommy
相关产品推荐
相关产品推荐

