如何实现鼠标悬停显示Gnuplot 3D-mesh单元格数值
Gnuplot 3D网格图悬停显示单元格数值实现方案
Gnuplot原生支持鼠标拾取绘图元素的数值,不需要依赖外部工具,配置后即可实现悬停显示单元格第四维(颜色强度)数值的效果。
基础方案:状态栏显示悬停数值
这是最简单的实现方式,不需要额外写回调,只需要补全鼠标交互配置,调整绘图语句保证单元格可被拾取即可:
- 开启鼠标悬停捕获
补全鼠标配置,开启悬停事件,自定义提示内容的格式:
配置后鼠标悬停在图上时,Gnuplot窗口底部状态栏会自动输出对应位置的数值,其中第四维的强度值就是你当前观察到的颜色映射对应原始值,存在内置变量set mouse hover # 自定义提示格式,依次输出x坐标、y坐标、z坐标、第四维强度值 set format mouse "x=%.1f | y=%.1f | z=%.1f | 强度值=%.3f"MOUSE_COLOR里。 - 调整绘图语句保证拾取精度
你当前的代码只绘制了黑色网格线,没有显式绘制pm3d填色层,鼠标无法精准匹配到网格单元格,需要调整splot语句,将pm3d填色层放在下层,网格线放在上层,既保留原有视觉效果,又能让鼠标正常拾取单元格数据:
额外加一行配置可以避免拾取到被曲面遮挡的背面单元格,匹配精度更高:# 注意:如果使用'-'内联数据,需要输入两次相同的数据块;建议将数据存为独立文本文件读取,避免重复输入 splot '-' using 1:2:3:4 with pm3d notitle, \ '-' using 1:2:3:4 notitle with lines lw .3 lc rgb 'black'set pm3d depthorder
进阶方案:光标旁弹出标签显示数值
如果不想看底部状态栏,想要数值直接跟随鼠标光标显示,可以通过绑定鼠标移动事件实现,新增配置如下:
# 初始化一个带边框的标签,用来显示悬停数值 set label 100 front boxed # 绑定鼠标移动事件:实时更新标签位置和显示内容 bind MouseMove "if (exists('MOUSE_X')) { set label 100 at mouse sprintf('强度:%.3f', MOUSE_COLOR); replot }" # 如果不需要底部状态栏提示,可以加下面这行关闭 # set mouse noverbose
完整配置参考
把原有代码和新增配置整合后,可直接使用的版本如下:
set cbrange [0.0:.2] set palette defined (0 'white', 1 'midnight-blue') set pm3d depthorder set contour surface set cntrparam levels incremental 0, 50, 1000 set xrange [0:1300] set yrange [0:1500] set zrange [0:1000] set xyplane at 0 set view 9, 88, 2.3 set view equal xy # 交互配置 set mouse hover set format mouse "x=%.1f | y=%.1f | z=%.1f | 强度值=%.3f" # 需弹出标签则解开下面两行注释 # set label 100 front boxed # bind MouseMove "if (exists('MOUSE_X')) { set label 100 at mouse sprintf('强度:%.3f', MOUSE_COLOR); replot }" # 绘图 splot '你的数据文件路径' using 1:2:3:4 with pm3d notitle, \ '' using 1:2:3:4 notitle with lines lw .3 lc rgb 'black'
你当前设置的视角、坐标轴范围、等高线配置都不需要修改,不会影响悬停拾取的效果。
内容的提问来源于stack exchange,提问作者Javero
相关产品推荐
相关产品推荐

