gnuplot:绘制带透明度的索引数据时自动统计点数
解决Gnuplot分组数据绘图的两个需求:自动统计点数图例+透明度表示强度
需求说明
- 数据格式:每组数据以
# group_xxx开头,前三列是三维坐标(x,y,z),第四列是强度值,每组点数不固定 - 目标1:自动统计每组点数,生成
group_0001: 10 pts.格式的图例标题 - 目标2:用点的透明度而非大小来表示第四列的强度值
实现代码
reset session $Data <<EOD # group_0001 125.714 109.647 38.0402 0.79257 128.834 111.153 40.7486 0.753538 132.036 112.698 43.4124 0.793434 135.52 114.449 46.0812 0.776121 138.786 116.233 48.1499 0.793355 142.357 117.967 50.2387 0.731456 145.967 119.98 52.2324 0.787673 148.363 121.234 53.44 0.749578 149.448 121.81 54.0276 0.80474 153.108 123.831 55.9821 0.786737 # group_0002 111.44 146.587 81.1063 0.755904 112.27 151.103 82.1631 0.649881 112.995 155.321 83.3001 0.791218 113.763 159.66 84.2395 0.746114 114.551 163.53 85.1278 0.744113 115.437 168.114 86.1995 0.767338 116.344 172.465 87.481 0.742969 EOD # 定义透明度映射函数:将强度值(假设0-1范围)转为0.1-1的透明度,避免完全透明 alpha(v) = v*0.9 + 0.1 # 循环处理每个数据组 do for [i=0:*] { # 统计当前组的点数 stats $Data index i nooutput # 提取组名:读取当前组的第一行注释 set print $GroupName print $Data index i every ::0::0 set print groupName = strstrt($GroupName[1], "# ") == 0 ? sprintf("group_%04d", i) : substr($GroupName[1], 3) # 生成图例标题 legendTitle = sprintf("%s: %d pts.", groupName, STATS_records) # 绘图:固定点大小,透明度由第四列控制,每组用不同颜色区分 splot $Data index i using 1:2:3:(alpha($4)) with points pt 7 ps 2 lc rgb hsv2rgb(i*0.3,1,1) alpha var title legendTitle, \ for [j=i+1:*] NaN notitle }
关键逻辑解释
- 自动统计点数:通过
stats命令获取当前组的行数STATS_records,结合读取到的组注释行,拼接成带点数的图例标题 - 透明度表示强度:自定义
alpha()函数将原始强度值映射到可见的透明度区间,绘图时用alpha var指定透明度由第四列控制,同时固定点大小ps 2替代原有的ps var - 组颜色区分:用
hsv2rgb()函数根据组索引生成不同颜色,避免多个组点色重叠
内容的提问来源于stack exchange,提问作者magfan
相关产品推荐
相关产品推荐

