Ubuntu中利用GNUPLOT画NS3产生的数据
(一)直接使用Gnuplot工具
以NS3自带的例子程为例来说明。
进行NS安装目录,下面有/examples/tutorial目录下,有一个拥塞窗口的例子 fifth.cc
把它复制到scratch目录下。
则在后台完成对fifth.cc的运行并把结果存在ns-3.25目录下的fifth.dat中
解释:
“>” 表示输出重定向。
“>”fifth.dat 把执行的结果存入到文件。一般情况下,输出重定向到当前屏幕,>fifth.dat表示输出重定向到该文件。
2>&1 在shell中,文件描述符通常是:STDIN,STDOUT,STDERR,即:0,1,2,
&表示在后台执行, 2>&1 表示,把错误信息stderr也放到stdout中输出.
在dat所在目录下进入GNUPLOT
在gunplot环境下,输入以上命令,会发现在ns-3.25目录下产生fifth.png图
解释:
set termianl png //设置输出图片格式,如png,gif,jpg等
set size width,height //设备图片宽度,高度
set output “图片名称” //设置保存图片名称。
plot title “标题名” //设置图片标题名称,一般用英文,有时不支持中文字符
plot “数据.dat” using 1:2 with linespoints //把数据文件”数据.dat”输出图像, using 1:2,使用第1,2列数据输出.
with linespoints //点用符号,点与点之间用线连接
a plot “数据.dat” //只输出数据点
b plot “数据.dat” with lines //把点连起来,成线。
c plot “数据.dat” with linespoints //点用符号,点与点之间用线连接
d plot ‘file.dat’ using 1:3 with linespoints //使用1,3列绘图
e plot ‘file.dat’ using 1:($3/2) with linespoints //使用第一列与第三列的二分之一绘图
(二)用Gnuplot类
其实就是间接使用Gnuplot工具。
在程序里边加入Gnuplot类,我们可看一个例子:
目录/ns3/ns-allinone-3.25/ns-3.25/src/stats/examples下的gnuplot-example.cc。
把程序复制到scratch目录下边。编译程序:
在ns-3.25目录下边将会产生三个文件:
plot-2d.plt
plot-2d-with-error-bars.plt
plot-3d.plt
在目录ns-3.25执行以下命令:
查看得到的三个文件:
plot-2d.png
plot-2d-with-error-bars.png
plot-3d.png
源代码:
#include <fstream>
#include "ns3/gnuplot.h"
using namespace ns3;
namespace {
//===========================================================================
// Function: Create2DPlotFile
//
//
// This function creates a 2-D plot file.
//===========================================================================
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";
// Instantiate the plot and set its title.
Gnuplot plot (graphicsFileName);
plot.SetTitle (plotTitle);
// Make the graphics file, which the plot file will create when it
// is used with Gnuplot, be a PNG file.
plot.SetTerminal ("png");
// Set the labels for each axis.
plot.SetLegend ("X Values", "Y Values");
// Set the range for the x axis.
plot.AppendExtra ("set xrange [-6:+6]");
// Instantiate the dataset, set its title, and make the points be
// plotted along with connecting lines.
Gnuplot2dDataset dataset;
dataset.SetTitle (dataTitle);
dataset.SetStyle (Gnuplot2dDataset::LINES_POINTS);
double x;
double y;
// Create the 2-D dataset.
for (x = -5.0; x <= +5.0; x += 1.0)
{
// Calculate the 2-D curve
//
// 2
// y = x .
//
y = x * x;
// Add this point.
dataset.Add (x, y);
}
// Add the dataset to the plot.
plot.AddDataset (dataset);
// Open the plot file.
std::ofstream plotFile (plotFileName.c_str());
// Write the plot file.
plot.GenerateOutput (plotFile);
// Close the plot file.
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";
// Instantiate the plot and set its title.
Gnuplot plot (graphicsFileName);
plot.SetTitle (plotTitle);
// Make the graphics file, which the plot file will create when it
// is used with Gnuplot, be a PNG file.
plot.SetTerminal ("png");
// Set the labels for each axis.
plot.SetLegend ("X Values", "Y Values");
// Set the range for the x axis.
plot.AppendExtra ("set xrange [-6:+6]");
// Instantiate the dataset, set its title, and make the points be
// plotted with no connecting lines.
Gnuplot2dDataset dataset;
dataset.SetTitle (dataTitle);
dataset.SetStyle (Gnuplot2dDataset::POINTS);
// Make the dataset have error bars in both the x and y directions.
dataset.SetErrorBars (Gnuplot2dDataset::XY);
double x;
double xErrorDelta;
double y;
double yErrorDelta;
// Create the 2-D dataset.
for (x = -5.0; x <= +5.0; x += 1.0)
{
// Calculate the 2-D curve
//
// 2
// y = x .
//
y = x * x;
// Make the uncertainty in the x direction be constant and make
// the uncertainty in the y direction be a constant fraction of
// y's value.
xErrorDelta = 0.25;
yErrorDelta = 0.1 * y;
// Add this point with uncertainties in both the x and y
// direction.
dataset.Add (x, y, xErrorDelta, yErrorDelta);
}
// Add the dataset to the plot.
plot.AddDataset (dataset);
// Open the plot file.
std::ofstream plotFile (plotFileName.c_str());
// Write the plot file.
plot.GenerateOutput (plotFile);
// Close the plot file.
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";
// Instantiate the plot and set its title.
Gnuplot plot (graphicsFileName);
plot.SetTitle (plotTitle);
// Make the graphics file, which the plot file will create when it
// is used with Gnuplot, be a PNG file.
plot.SetTerminal ("png");
// Rotate the plot 30 degrees around the x axis and then rotate the
// plot 120 degrees around the new z axis.
plot.AppendExtra ("set view 30, 120, 1.0, 1.0");
// Make the zero for the z-axis be in the x-axis and y-axis plane.
plot.AppendExtra ("set ticslevel 0");
// Set the labels for each axis.
plot.AppendExtra ("set xlabel \"X Values\"");
plot.AppendExtra ("set ylabel \"Y Values\"");
plot.AppendExtra ("set zlabel \"Z Values\"");
// Set the ranges for the x and y axis.
plot.AppendExtra ("set xrange [-5:+5]");
plot.AppendExtra ("set yrange [-5:+5]");
// Instantiate the dataset, set its title, and make the points be
// connected by lines.
Gnuplot3dDataset dataset;
dataset.SetTitle (dataTitle);
dataset.SetStyle ("with lines");
double x;
double y;
double z;
// Create the 3-D dataset.
for (x = -5.0; x <= +5.0; x += 1.0)
{
for (y = -5.0; y <= +5.0; y += 1.0)
{
// Calculate the 3-D surface
//
// 2 2
// z = x * y .
//
z = x * x * y * y;
// Add this point.
dataset.Add (x, y, z);
}
// The blank line is necessary at the end of each x value's data
// points for the 3-D surface grid to work.
dataset.AddEmptyLine ();
}
// Add the dataset to the plot.
plot.AddDataset (dataset);
// Open the plot file.
std::ofstream plotFile (plotFileName.c_str());
// Write the plot file.
plot.GenerateOutput (plotFile);
// Close the plot file.
plotFile.close ();
}
} // anonymous namespace
int main (int argc, char *argv[])
{
// Create a 2-D plot file.
Create2DPlotFile();
// Create a 2-D plot with error bars file.
Create2DPlotWithErrorBarsFile();
// Create a 3-D plot file.
Create3DPlotFile();
return 0;
}