跳转到内容

GLPK/Gnuplot

来自维基教科书,开放世界中的开放书籍

Gnuplot 是一个用于生成函数、数据和数据拟合的二维和三维图表的程序。Gnuplot 在 GNU 通用公共许可证下发布。

二维直方图

[编辑 | 编辑源代码]
使用 gnuplot 从 GLPK 解生成的二维直方图

Gnuplot 期望直方图的数据以多列形式提供。

以下示例基于examples/transp.mod来自 GLPK 源代码分发

solve;
printf '""' > 'transp1.dat';
printf {j in J} ' "%s"', j >> 'transp1.dat';
printf '\n' >> 'transp1.dat';
for {i in I} {
  printf '"%s"', i >> 'transp1.dat';
  printf {j in J} ' %f', x[i,j] >> 'transp1.dat';
  printf '\n' >> 'transp1.dat';
}

上面的 MathProg 语句(插入到transp.mod的数据语句之前,并另存为名为transp1.mod的文件中)将使用以下命令创建:glpsol --math transp1.mod,在文件transp1.dat:

"" "New-York" "Chicago" "Topeka"
"Seattle" 50.000000 300.000000 0.000000
"San-Diego" 275.000000 0.000000 275.000000 

中创建以下内容:transp1.dat可以使用 gnuplot 绘制

reset
set terminal png truecolor transparent font "Arial, 16" size 800x600
set output "transp1.png"
set title 'Result of transp.mod'
set style data histogram
set style histogram cluster gap 1
set style fill solid border −1
set boxwidth 0.9
set bmargin 5
set grid y
set xrange [−0.5:2.5]
set xtics out nomirror
plot 'transp1.dat' \
  using 2:xtic(1) title columnheader(2), \
  for [i=3:4] '' using i title columnheader(i)

的直方图,然后将其保存为 PNG 图像上面的命令可以手动输入到交互式 gnuplot 会话中。调用gnuplot从命令行启动这样的会话。或者,可以将相同的命令保存在文本文件transp1.gp

gnuplot> load "transp1.gp"

中,然后作为脚本从 gnuplot 中运行最后,使用任何位图查看器检查生成的transp1.png

gthumb transp1.png &

,例如 gthumb

三维直方图
[编辑 | 编辑源代码]

使用 gnuplot 从 GLPK 解生成的 3D 直方图

  • Gnuplot 不直接支持原生 3D 直方图。可以使用以下规则将具有矩形网格的曲面传递给 gnuplot
  • 每个点提供一行文本,每个字段之间用空格隔开
  • 同一栅格线上的连续点应位于连续的文本行上

在连续栅格线上的点之间放置一个空文本行。examples/transp.mod:

solve;

printf '' > 'transp2.dat';
for { i in I  } {
  for { j in J } {
    printf '%i "%s"', sum{k in I: k < i} 1, i >> 'transp2.dat';
    printf ' %i "%s"', sum{l in J: l < j} 1, j >> 'transp2.dat';
    printf ' %f', x[i,j] >> 'transp2.dat';
    printf '\n' >> 'transp2.dat';

    printf '%i "%s"', sum{k in I: k < i} 1, i >> 'transp2.dat';
    printf ' %i "%s"', sum{l in J: l <= j} 1, '' >> 'transp2.dat';
    printf ' %f', x[i,j] >> 'transp2.dat';
    printf '\n' >> 'transp2.dat';
    }
    printf '\n' >> 'transp2.dat';
  for { j in J } {
    printf '%i "%s"', sum{k in I: k <= i} 1, '' >> 'transp2.dat';
    printf ' %i "%s"', sum{l in J: l < j} 1, j >> 'transp2.dat';
    printf ' %f', x[i,j] >> 'transp2.dat';
    printf '\n' >> 'transp2.dat';

    printf '%i "%s"', sum{k in I: k <= i} 1, '' >> 'transp2.dat';
    printf ' %i "%s"', sum{l in J: l <= j} 1, '' >> 'transp2.dat';
    printf ' %f', x[i,j] >> 'transp2.dat';
    printf '\n' >> 'transp2.dat';
    }
    printf '\n' >> 'transp2.dat';
  }
data;

set I := San-Diego Seattle;

set J := Chicago New-York Topeka;

要创建 3D 直方图,需要提供直方图每个柱子的 4 个角点。以下示例再次基于如前所述,可以使用 gnuplot 绘制transp2.dat

reset
set terminal png font "Arial, 16" transparent size 800,800
set output "transp2.png"
set title 'Result of transp.mod'
set xtic offset first 0.5, first −0.25, first 0 mirror
set ytic offset first 0.25, first 0.5, first 0 mirror
set nokey
set pm3d
set palette gray
set grid x y z
splot 'transp2.dat' using 1:3:5:xtic(2):ytic(4) with pm3d
的 3D 直方图,并将其保存为 PNG 图像
华夏公益教科书