Gnuplot:能否用更简便方法替代点类型显示图片?
关于Gnuplot用图片替代数据点的简化实现方法
我已经看过一篇介绍Gnuplot用图片替代点类型的文章,文中方法是通过包含图片名称的向量、数值数组配合For命令迭代来实现。想请教:有没有更简便的实现方式?还是说文中的方法是当前Gnuplot实现该需求的唯一途径?
以下是我尝试用图片替代点类型的失败代码示例:
$DATA<<EOD 1,"c:\temp\image1.png",0.00,0.00 2,"c:\temp\image1.png",424.75,549.75 3,"c:\temp\image1.png",849.50,1099.50 4,"c:\temp\image2.png",1274.25,1649.25 5,"c:\temp\image2.png",1698.00,2198.00 EOD set terminal windows enhanced size 1700,2200 set datafile separator comma set style data point unset xtics unset ytics set border 0 set key off set xrange [0:1699] set yrange [0:2199] plot $DATA with image '$2' binary filetype=png center=($3,$4) rgbimage
首先说结论:你尝试的plot $DATA with image写法行不通,因为with image模式本质是用来绘制单张完整位图(比如热图、背景图),没法直接从数据列读取多个图片路径并定位绘制。
目前Gnuplot确实没有原生支持「从数据文件批量读取图片路径+指定坐标绘制」的单命令方案,但你看到的数组+循环方法可以简化,不用手动定义向量和数组:
简化后的可行代码
$DATA<<EOD 1,"c:\temp\image1.png",0.00,0.00 2,"c:\temp\image1.png",424.75,549.75 3,"c:\temp\image1.png",849.50,1099.50 4,"c:\temp\image2.png",1274.25,1649.25 5,"c:\temp\image2.png",1698.00,2198.00 EOD set terminal windows enhanced size 1700,2200 set datafile separator comma unset xtics unset ytics set border 0 set key off set xrange [0:1699] set yrange [0:2199] # 自动提取数据中唯一的图片路径(Windows环境若无awk,可手动替换为图片列表) unique_images = system("awk -F',' '{print $2}' $DATA | sort | uniq") # 循环绘制每个图片对应的坐标点 do for [img in unique_images] { plot $DATA using 3:4 \ filename=img \ with image binary filetype=png center=(column(3),column(4)) \ notitle }
关键优化点
- 用
system调用awk自动提取并去重数据里的图片路径,不用手动维护数组 - 循环遍历每个图片,一次性绘制该图片对应的所有坐标点,减少重复代码
注意事项
- 如果是Windows环境且没有awk工具,可以手动列出图片路径,比如
unique_images = '"c:\temp\image1.png" "c:\temp\image2.png"' - 可以通过
size=(width, height)参数调整图片显示大小,比如size=(50,50)
内容的提问来源于stack exchange,提问作者Marionette_66
相关产品推荐
相关产品推荐

