You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:05:26