如何在Bash脚本中绘制bitrates与psnrArray数组的图表?
在Bash中实现Bitrate与PSNR数组的可视化绘图
我来帮你搞定这个Bash脚本绘图的需求!既然你已经把比特率和PSNR数据写入了Data文件,接下来用gnuplot来生成可视化图表就非常合适——这是Linux/macOS生态里最常用的命令行绘图工具,几乎所有发行版都能通过包管理器快速安装。
第一步:整理数据格式
你当前的Data文件是两行数据:第一行是所有比特率值,第二行是对应的PSNR值。但gnuplot默认按列读取数据(每行一组对应数据),所以咱们需要先把两行转成两列的格式。
你可以直接在脚本里处理,不用手动修改文件:
# 把Data文件的两行数据转成两列(每行对应一个bitrate和PSNR配对值) paste <(cat Data | head -n1 | tr ' ' '\n') <(cat Data | tail -n1 | tr ' ' '\n') > formatted_data.txt
或者更高效的方式——直接用数组生成格式化数据,跳过Data中间文件:
paste <(echo "${bitrates[*]}" | tr ' ' '\n') <(echo "${psnrArray[*]}" | tr ' ' '\n') > formatted_data.txt
第二步:用gnuplot生成图表
接下来调用gnuplot绘制折线图,这里给你写好完整的Bash调用脚本:
# 调用gnuplot生成PNG格式的图表 gnuplot << EOF set terminal png enhanced font 'Arial,12' # 设置输出格式为PNG,指定字体和字号 set output 'bitrate_psnr_plot.png' # 指定输出文件名称 set title 'Bitrate vs PSNR Performance' # 设置图表标题 set xlabel 'Bitrate' # 设置X轴标签 set ylabel 'PSNR (dB)' # 设置Y轴标签 set grid # 显示网格线,提升可读性 # 绘制折线+数据点,用第1列做X轴,第2列做Y轴,设置点样式和大小 plot 'formatted_data.txt' using 1:2 with linespoints pointtype 7 pointsize 1.5 title 'PSNR Curve' EOF
如果你不想生成formatted_data.txt中间文件,也可以直接通过管道把数据传给gnuplot,一步到位:
gnuplot << EOF set terminal png enhanced font 'Arial,12' set output 'bitrate_psnr_plot_direct.png' set title 'Bitrate vs PSNR (Direct Data)' set xlabel 'Bitrate' set ylabel 'PSNR (dB)' set grid # 直接通过管道传递格式化后的数据,无需中间文件 plot '< paste <(echo "${bitrates[*]}" | tr " " "\n") <(echo "${psnrArray[*]}" | tr " " "\n")' using 1:2 with linespoints pointtype 7 pointsize 1.5 title 'PSNR Curve' EOF
补充:安装gnuplot
如果你的系统还没装gnuplot,用下面的命令安装:
- Ubuntu/Debian:
sudo apt install gnuplot - CentOS/RHEL:
sudo yum install gnuplot - macOS:
brew install gnuplot
完整脚本示例
把所有步骤整合起来,就是一个可以直接运行的Bash脚本:
#!/bin/bash # 定义比特率数组 bitrates=(1 2 3 4 5) # 模拟动态填充的PSNR数组(实际使用时替换为你的逻辑) psnrArray=(30.5 32.1 34.8 36.5 38.2) # 生成格式化数据文件 paste <(echo "${bitrates[*]}" | tr ' ' '\n') <(echo "${psnrArray[*]}" | tr ' ' '\n') > formatted_data.txt # 生成图表 gnuplot << EOF set terminal png enhanced font 'Arial,12' set output 'bitrate_psnr_plot.png' set title 'Bitrate vs PSNR' set xlabel 'Bitrate' set ylabel 'PSNR (dB)' set grid plot 'formatted_data.txt' using 1:2 with linespoints pointtype 7 pointsize 1.5 title 'PSNR Curve' EOF echo "图表已成功生成:bitrate_psnr_plot.png"
运行这个脚本后,你就能得到一张清晰的折线图,直观展示比特率和PSNR的对应关系啦!
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

