如何绘制带阴影区域的二元函数sublevel set及单变量函数曲线?
在Gnuplot中绘制二元函数子水平集(阴影区域)+单变量曲线
以下是两种可靠的解决方案,针对你遇到的子水平集无法正确填充阴影的问题:
方法一:直接用pm3d绘制填充区域(推荐)
无需额外保存数据文件,直接通过条件过滤绘制子水平集,同时叠加单变量曲线:
# 定义子水平集阈值 value = 0.5 # 设置x、y轴范围(根据你的函数调整) set xrange [-3:3] set yrange [-3:3] # 配置2D视图和填充样式 set view map set pm3d map depthorder set palette model RGB defined (0 "lightgray") # 自定义子水平集填充颜色 unset colorbox # 隐藏颜色条(可选) # 绘制子水平集(f(x,y) ≤ value的区域)+单变量曲线 splot (f(x,y) <= value ? f(x,y) : 1/0) with pm3d, \ g(x) with lines lw 2 lc "darkblue"
关键要点:
set view map将3D绘图转为2D平面视图- 用
(f(x,y) <= value ? f(x,y) : 1/0)过滤出子水平集区域,不满足条件的点被忽略 pm3d会自动填充满足条件的连续区域,无需处理散点数据
方法二:提取等值线后填充内部
如果需要基于等值线数据绘制,确保提取闭合的等值线再填充:
value = 0.5 set xrange [-3:3] set yrange [-3:3] # 提取子水平集的等值线数据到文件 set table 'sublevel_contour.dat' set contour base # 仅绘制基础等值线(无表面) set cntrparam levels discrete value # 指定阈值 unset surface set view map splot f(x,y) unset table # 绘制填充区域+单变量曲线 plot 'sublevel_contour.dat' with filledcurves closed fc "lightgray", \ g(x) with lines lw 2 lc "darkblue"
关键要点:
set contour base确保只生成等值线数据,避免干扰filledcurves closed强制将等值线视为闭合区域,正确填充内部- 若等值线不闭合(比如函数在边界截断),可手动补充边界点或调整x/yrange
之前方法的问题分析
- 方法一用散点数据尝试
filledcurves:filledcurves需要连续的闭合曲线数据,散点无法被正确识别为填充区域,因此只能用points显示 - 方法三未指定
filledcurves closed:若等值线数据不闭合或格式不对,filledcurves无法自动填充内部,加上closed参数可解决大部分情况
内容的提问来源于stack exchange,提问作者Edwin Franks
相关产品推荐
相关产品推荐

