GLPK/Gnuplot
Gnuplot is a program for generating two and three dimensional plots of functions, data, and data fits. Gnuplot is published under the GNU General Public License.
2D histogram
editGnuplot expects data for histograms to be in multiple columns.
The following example is based on examples/transp.mod from the GLPK source distribution:
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';
}
The above MathProg statements (inserted before the data statements of transp.mod and saved as a file named transp1.mod) will create, using the command glpsol --math transp1.mod, the following content in the file transp1.dat:
"" "New-York" "Chicago" "Topeka" "Seattle" 50.000000 300.000000 0.000000 "San-Diego" 275.000000 0.000000 275.000000
Using gnuplot, a histogram of transp1.dat can be drawn and then saved as a PNG image:
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)
The above commands can either be hand entered into an interactive gnuplot session. Invoke gnuplot from the command-line to start such a session. Alternatively, the same commands can be saved in a text file transp1.gp and then run as a script from within gnuplot:
gnuplot> load "transp1.gp"
Finally, check the resulting transp1.png with any bitmap viewer, perhaps gthumb:
gthumb transp1.png &
3D histogram
editGnuplot does not directly support native 3D histograms. Surfaces with rectangular grids can be passed to gnuplot using the following rules:
- provide one text line per point, with each field separated by a space
- consecutive points of one raster line should be on consecutive text lines
- place a blank text line between points of consecutive raster lines.
To create a 3D histogram it is necessary to provide the 4 corner points of each pillar of the histogram. The following example is again based on 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;
As before, a 3D histogram of transp2.dat can be drawn using gnuplot and saved as a PNG image:
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