ns-3的绘图工具——Gnuplot

对仿真数据进行统计分析,并做成图表可以更加直观地体现协议的性能。本文将介绍如何使用Gnuplot把ns-3仿真程序捕获的数据做成图表。

使用ns-3和gnuplot绘制图形有两种常用方法(http://www.gnuplot.info):

  1. 使用ns-3的gnuplot类创建gnuplot控制文件。
  2. 使用ns-3生成的值创建gnuplot数据文件。

这里主要介绍方法1,即如何使用ns-3的gnuplot类绘制图。如果对方法2感兴趣,请参阅NS-3Tutorial中“Tracing”部分的“A Real Example”小节。

1.Gnuplot

gnuplot是一个命令行驱动的交互式绘图工具(command-driven interactive function plotting program),可将数学函数或数值资料以平面图或立体图的形式画在不同种类终端机或绘图输出装置上。它是由Colin Kelley 和 Thomas Williams于1986年开发的绘图程序发展而来的,可以在多个平台下使用。gnuplot既支持命令行交互模式,也支持脚本。

如果Ubuntu中尚未安装Gnuplot,使用如下命令安装:

sudo apt-get install gnuplot

安装完成之后进行测试。输入gnuplot进入交互式界面。
输入如下命令:plot[-3.14:3.14]sin(x),如下图所示:
得到如下的正弦曲线:

2.Gnuplot类

ns-3为了能生成Gnuploy数据图表提供了一组和Gnuplot连接的类,包含在头文件ns3/gnuplot.h中,可分成两类。

(1)Gnuplot类:是ns-3和Gnuplot连接的重要接口,其功能包括:设置文件名,坐标,标题,添加数据集,生成文件等。

(2)GnuplotDataset类:只是一个数据集,存储plot数据供Gnuplot使用。

可参考https://www.nsnam.org/docs/release/3.29/doxygen/classns3_1_1_gnuplot.html

3.使用Gnuplot

必须采取以下步骤才能使用ns-3的gnuplot类创建绘图:

  1. 修改代码,以便使用gnuplot类及其函数。
  2. 运行代码,以创建gnuplot控制文件。
  3. 使用gnuplot控制文件的名称调用gnuplot。
  4. 在任意图片查看器中浏览生成的图形文件。

下面使用示例src/stats/examples/gnuplot-example.cc来演示Gnuplot类和Gnuplot工具的使用。

1)运行例子
w@wangl:~/tarballs/ns-allinone-3.29/ns-3.29$ ./waf --run src/stats/examples/gnuplot-example

2)程序运行后生成Gnuplot控制文件
plot-2d.plt
plot-2d-with-error-bars.plt
plot-3d.plt

3)使用Gnuplot处理Gnuplot控制文件

$ gnuplot plot-2d.plt
$ gnuplot plot-2d-with-error-bars.plt
$ gnuplot plot-3d.plt

4)处理后生成图片文件
plot-2d.png
plot-2d-with-error-bars.png
plot-3d.png

5.)打开图片文件

下面是具体的代码分析:

#include <fstream>#include "ns3/gnuplot.h"        //包含gnuplot.h头文件using namespace ns3;            //声明命名空间namespace {//===========================================================================
// Function: Create2DPlotFile
// This function creates a 2-D plot file.
// 生成二维图的函数
// 由于使用ns-3命名空间,所有标准C++要加上std::前缀
//===========================================================================
void Create2DPlotFile ()
{std::string fileNameWithNoExtension = "plot-2d";std::string graphicsFileName        = fileNameWithNoExtension + ".png";std::string plotFileName            = fileNameWithNoExtension + ".plt";std::string plotTitle               = "2-D Plot";std::string dataTitle               = "2-D Data";// 安装plot并设置其标题Gnuplot plot (graphicsFileName);plot.SetTitle (plotTitle);// 设置文件格式// 使绘图文件与gnuplot一起使用时将创建的图形文件成为PNG文件。plot.SetTerminal ("png");// 设置坐标标签plot.SetLegend ("X Values", "Y Values");// 设置坐标范围plot.AppendExtra ("set xrange [-6:+6]");// 初始化数据集,设置标题和风格// 点与连接线一起绘制Gnuplot2dDataset dataset;dataset.SetTitle (dataTitle);dataset.SetStyle (Gnuplot2dDataset::LINES_POINTS);double x;double y;// 生成二维数据集for (x = -5.0; x <= +5.0; x += 1.0){// 图形曲线y = x * x;// 向数据集中添加坐标dataset.Add (x, y);}// 把数据集添加到Gnuplot对象plot.AddDataset (dataset);// 打开plot文件std::ofstream plotFile (plotFileName.c_str());// 写plot文件plot.GenerateOutput (plotFile);// 关闭plot文件plotFile.close ();
}//===========================================================================
// Function: Create2DPlotWithErrorBarsFile
// This function creates a 2-D plot with error bars file.
// 生成带有误差线的二维图的函数
//===========================================================================void Create2DPlotWithErrorBarsFile ()
{std::string fileNameWithNoExtension = "plot-2d-with-error-bars";std::string graphicsFileName        = fileNameWithNoExtension + ".png";std::string plotFileName            = fileNameWithNoExtension + ".plt";std::string plotTitle               = "2-D Plot With Error Bars";std::string dataTitle               = "2-D Data With Error Bars";// 安装plot并设置其标题Gnuplot plot (graphicsFileName);plot.SetTitle (plotTitle);// 设置文件格式// 使绘图文件与gnuplot一起使用时将创建的图形文件成为PNG文件。plot.SetTerminal ("png");// 设置坐标标签plot.SetLegend ("X Values", "Y Values");// 设置坐标范围plot.AppendExtra ("set xrange [-6:+6]");// 初始化数据集,设置标题和风格// 只绘制点,无连接线Gnuplot2dDataset dataset;dataset.SetTitle (dataTitle);dataset.SetStyle (Gnuplot2dDataset::POINTS);// 使数据集在X和Y方向都有误差线dataset.SetErrorBars (Gnuplot2dDataset::XY);double x;double xErrorDelta;double y;double yErrorDelta;// 生成二维数据集for (x = -5.0; x <= +5.0; x += 1.0){// 图形曲线y = x * x;// 使X方向的不确定性保持不变,使Y方向的不确定性成为其取值的一个恒定比值xErrorDelta = 0.25;yErrorDelta = 0.1 * y;// 在x和y方向添加这个不确定点dataset.Add (x, y, xErrorDelta, yErrorDelta);}// 把数据集添加到Gnuplot对象plot.AddDataset (dataset);// 打开plot文件std::ofstream plotFile (plotFileName.c_str());// 写plot文件plot.GenerateOutput (plotFile);// 关闭plot文件plotFile.close ();
}//===========================================================================
// Function: Create3DPlotFile
// This function creates a 3-D plot file.
// 生成三维图的函数
//===========================================================================void Create3DPlotFile ()
{std::string fileNameWithNoExtension = "plot-3d";std::string graphicsFileName        = fileNameWithNoExtension + ".png";std::string plotFileName            = fileNameWithNoExtension + ".plt";std::string plotTitle               = "3-D Plot";std::string dataTitle               = "3-D Data";// 安装plot并设置其标题Gnuplot plot (graphicsFileName);plot.SetTitle (plotTitle);// 设置文件格式// 使绘图文件与gnuplot一起使用时将创建的图形文件成为PNG文件。plot.SetTerminal ("png");// 围绕X轴旋转30度,然后围绕新Z轴旋转120度plot.AppendExtra ("set view 30, 120, 1.0, 1.0");// 使Z轴的零点位于X轴和Y轴所在的平面中plot.AppendExtra ("set ticslevel 0");// 设置坐标标签plot.AppendExtra ("set xlabel \"X Values\"");plot.AppendExtra ("set ylabel \"Y Values\"");plot.AppendExtra ("set zlabel \"Z Values\"");// 设置x轴和y轴的坐标范围plot.AppendExtra ("set xrange [-5:+5]");plot.AppendExtra ("set yrange [-5:+5]");// 初始化数据集,设置标题和风格// 使点通过线连接Gnuplot3dDataset dataset;dataset.SetTitle (dataTitle);dataset.SetStyle ("with lines");double x;double y;double z;// 创建三维数据集for (x = -5.0; x <= +5.0; x += 1.0){for (y = -5.0; y <= +5.0; y += 1.0){// 图形曲线z = x * x * y * y;// 向数据集中添加坐标dataset.Add (x, y, z);}// 在每一个X值数据点的末尾都需要空白线,以便3-D表面网格工作dataset.AddEmptyLine ();}// 把数据集添加到Gnuplot对象plot.AddDataset (dataset);// 打开plot文件std::ofstream plotFile (plotFileName.c_str());// 写plot文件plot.GenerateOutput (plotFile);// 关闭plot文件plotFile.close ();
}}  // 非命名空间int main (int argc, char *argv[])
{// 创建一个 2-D plot 文件.Create2DPlotFile();// 创建一个 2-D plot with error bars 文件.Create2DPlotWithErrorBarsFile();// 创建一个 3-D plot 文件.Create3DPlotFile();return 0;
}

本文参考了ns-3Manual手册https://www.nsnam.org/docs/release/3.29/manual/html/gnuplot.html?highlight=gnuplot

ns-3的绘图工具——Gnuplot相关推荐

  1. linux 数据绘图软件,linux下的数据绘图工具-gnuplot

    Gnuplot 是一种免费分发的绘图工具,可以移植到各种主流平台.它可以下列两种模式之一进行操作:当需要调整和修饰图表使其正常显示时,通过在 gnuplot 提示符中发出命令,可以在交互模式下操作该工 ...

  2. 复杂网络——绘图工具gnuplot技巧

    一.工具介绍 类似于Matlab绘图,gnuplot能根据txt文件进行绘制图像.比Matlab好用的一点在于,gnuplot能绘制出更高清,曲线更完美的图像. 初次使用时可能有些不理解,需要参考别人 ...

  3. linux gnuplot yum源,在CentOS上编译安装gnuplot绘图工具

    gnuplot是一个命令行的交互式绘图工具.用户通过输入命令,可以逐步设置或修改绘图环境,并以图形描述数据或函数,使我们可以借由图形做更进一步的分析. gnuplot是由Colin Kelly和Tho ...

  4. Linux画图工具gnuplot

    现在在网上可以找的科学作图软件有不少,其中不乏优秀者,Win平台上有大名鼎鼎的Origin.Tecplot.SigmaPlot等,类UNIX上有LabPlot.gnuplot等.其他的常见的计算软件如 ...

  5. linux怎么进入绘图模式,Linux 绘图工具

    Linux 绘图工具 2016-11-03 Thursday 主要介绍一下 Linux 中的 Gnuplot Graphviz 套件,主要用于画图. Ggnuplot 是一个命令行驱动的绘图工具,可将 ...

  6. <笔记1>matplotlib绘图工具笔记

    matplotlib绘图工具笔记 python中有许多非常方便的可视化工具,例如matplotlib,seaborn等.在这里主要总结matplotlib的简单绘图方法. 设置图形的大小和中文显示,图 ...

  7. HTML5 canvas 在线画笔绘图工具(三)

    组装画板(TDrawBuilder) 在这一小节中我们要把工具条和画板组装起来,让他们可以协同进行工作. 画板通过一个命名为TDrawBuilder来进行组装.在详细讲解TDrawBuilder对象之 ...

  8. 编程软件python图片-python Plotly绘图工具的简单使用

    1.plotly库的相关介绍 1)相关说明 plotly是一个基于javascript的绘图库,plotly绘图种类丰富,效果美观: 易于保存与分享plotly的绘图结果,并且可以与Web无缝集成: ...

  9. python 画柱状图-python使用Plotly绘图工具绘制柱状图

    本文实例为大家分享了python使用Plotly绘图工具绘制柱状图的具体代码,供大家参考,具体内容如下 使用Plotly绘制基本的柱状图,需要用到的函数是graph_objs 中 Bar函数 通过参数 ...

最新文章

  1. ionic中的ion-option-button
  2. 哈哈哈哈!如果孔子是个程序员,一定是P14
  3. android 换肤之style,android换肤总结
  4. php的sql语句用变量赋值,sql语句变量赋值
  5. STM32 单片机启动流程
  6. 胃癌2019csco指南_领读指南沈琳:2019CSCO胃癌指南重要更新
  7. Java的流读一行丢一行_java – 在少数特定情况下记录丢失的消息
  8. n阶自相关matlab代码,随机信号及其自相关函数和功率谱密度的MATLAB实现.doc
  9. 【超清视频】SCCM2012精讲系列课程03:SCCM2012的基础环境初始化(一)
  10. VC知识库五周年精华珍藏版(2CD)
  11. 鱼骨图和甘特图图表合集PPT模板
  12. php源码 辅助发卡_【程序源码】PHP自动化售货发卡网源码
  13. 通向AGI(通用人工智能)的另类书单
  14. 如何使用视频格式转换器将flv转换成MP4
  15. IntelliJ IDEA 简体中文字体
  16. 嵌入式Linux容器技术
  17. 携手鸿蒙HarmonyOS背后,美的的阳谋
  18. c语言字符动画源码下载,C语言动画程序源码.docx
  19. 计算机基础知识考试题库-----复习资料
  20. bluetoothd Protocol not available解决方法

热门文章

  1. UCOS III 任务堆栈理解
  2. 【Axure交互教程】 隐藏页面滚动条的3种方法
  3. wxX11移植到arm板上
  4. 【Python爬虫】从零开始爬取Sci-Hub上的论文(串行爬取)
  5. Android 解决使用VLC实现视频播放报错 libvlc decoder: more than 5 seconds of late video
  6. 2022,博士们,又开始晒工资了
  7. 猫眼爬虫三-终极篇:破解滑动验证,动态字体加密
  8. margin 重叠问题的理解
  9. Led护眼灯真的有效果吗?2022双十一最值得入手护眼台灯推荐
  10. 《游戏学习》Java实现仿雷电游戏设计