如何在gnuplot中根据重复次数加粗/放大重叠数据点?
在Gnuplot中根据重复次数调整数据点大小的实现方法
当然可以实现!核心思路是先统计每个数据点的重复次数,再把次数作为参数来控制点的大小(ps)——毕竟“加粗”在gnuplot里大多通过调整点尺寸来实现,视觉效果是一致的。下面分步骤给你讲具体怎么做:
第一步:预处理数据,统计重复次数
Gnuplot本身没法直接统计重复点,所以我们先把数据整理成每行一个(x,y)点的格式,再用命令行工具统计次数。
处理你的示例数据
你的原始数据是一行多个值:
1 1 1 1 1 1 2 0.0 2 0.0 2 0.314285714286 2 0.967213114754 2 0.936507936508
先把它转换成每行一个点(Linux/macOS环境下):
# 假设原始数据存为original.txt tr ' ' '\n' < original.txt | paste - - > formatted.txt
执行后formatted.txt会变成:
1 1 1 1 1 1 1 1 1 1 1 1 2 0.0 2 0.0 2 0.314285714286 2 0.967213114754 2 0.936507936508
统计每个点的重复次数
接着用sort+uniq+awk统计次数,生成带计数的新文件:
sort formatted.txt | uniq -c | awk '{print $2, $3, $1}' > counted.txt
得到的counted.txt里第三列就是重复次数:
1 1 6 2 0.0 2 2 0.314285714286 1 2 0.967213114754 1 2 0.936507936508 1
第二步:在Gnuplot中用计数控制点大小
现在就可以用第三列的数值来设置点的大小了,比如:
# 加个缩放因子,避免重复次数太多导致点过大 plot "counted.txt" title "file 1" pt 7 ps ($3 * 0.25), \ "counted_file2.txt" title "file 2" pt 5 ps ($3 * 0.25) lc rgb "red"
pt 7是实心圆,pt 5是空心圆,用来区分不同文件的点($3 * 0.25)表示用第三列的计数乘以0.25作为点大小,你可以根据实际效果调整这个系数
如果不想用命令行预处理,也可以在Gnuplot里用数组和循环统计,但数据量大的时候会比较慢,所以更推荐先用命令行处理好数据。
额外提示
- 如果你的数据本来就是每行一个点,跳过第一步的格式转换直接统计就行
- 要是想让点的“加粗”效果更明显,可以搭配不同的点类型(比如
pt 0空心圆+lw线宽,不过实心圆的大小调整视觉效果更直接)
内容的提问来源于stack exchange,提问作者Nofel Yaseen
相关产品推荐
相关产品推荐

