Chart-Gnuplot-0.23/0000755000377200037720000000000012471026132013145 5ustar kwmakkwmakChart-Gnuplot-0.23/Changes0000644000377200037720000001353312471025536014454 0ustar kwmakkwmakChange log for Chart::Gnuplot 0.23 - CHG update copyright session of POD - FIX testsuite for axis tics 0.22 - NEW support "layer" option in drawing arbitrary lines, arrows, borders, grid, and adding labels - NEW support manually-specified range for tic location (Thanks to Paul Evans) 0.21 - FIX the persistance of label and arrow over plots in multiplot (Thanks to Dave Lee) - FIX repeatedly unset and set logscale in multiplot (Thanks to Dave Lee) - FIX the persistance of shape (circles, rectangles, ...) over plots in multiplot 0.20 - NEW support drawing arbitrary polygons - NEW support alpha value in filling styles and objects for certain terminals - NEW chart object method "command" supports executing an array of commands - NEW more test cases - CHG automatically set "using" of the dataSet object in plotting histogram - CHG code refactoring in Chart::Gnuplot::DataSet - CHG make private method "_execute()" public - CHG update POD - FIX data processing of array of points in plotting 3D surface - FIX data processing of plotting "hbars" 0.19 - NEW support drawing arbitrary rectangles, ellipses and circles - NEW Perlish setting of arrow head of arbitary arrows - NEW support filling pattern in box-type styles - NEW support setting color for the border of the box-type styles - NEW support curve fitting (experimental) - CHG check OS using /MSWin/ instead of "MSWin32" for safty - FIX grid options syntax error if the options are not in hash form 0.18 - Add try to guess the path of the gnuplot executable in Windows (Bug ID: 82525) - CHG improve POD - CHG use qq() instead of "" in Gnuplot command line construction (Bug ID: 82525) - CHG use qq() instead of "" in convert command line construction - FIX offset and font options of the time stamp 0.17 - NEW control the display of arbitrary border of the graph - FIX expression of range of numeric axis if time axis exists (Bug ID: 69169) 0.16 - Add support of creating animated gif - Option to unset "(x|y)tics" and "border" (Thanks to Adam Russell) - Improve POD 0.15 - Fix the problem that "orient" has no effect if "imagesize" is set - Fix setting color of the label point 0.14 - Support drawing arbitrary arrows - Support importing data as "points" for "financebars" and "candlesticks" charts - Better support of the terminals other than the default (postscript) - Change using ImageMagick instead of ps2pdf to generate PDF from PS - Fix the problem that the location of the text labels cannot be in date/time format 0.13 - Improve error handling - Add method to copy the chart and data set objects - Add specific get-set methods for xdata, ydata, zdata, points, datafile and func so that different data sources cannot co-exist in the same data set object - Keep the plot window from disappearing immediately for interactive terminals (Thanks to Alex White) - More strict testsuite. Add more test cases 0.12 - More understandable error messages - Add an example in POD (Thanks to WOLfgang Schricker) 0.11 - Add new plotting styles "hbars" (horizontal bars) and "hlines" (horizontal lines) - Add frame to the example webpage 0.10 - Support "every" and "index" features - Support control of the tics on the z-axis - Change the directory for the temporary files to the default of File::Temp - Fix a bug that options do not reset to their default after plotting each sub-chart in multiplot - Fix a bug in plotting financial time series when the x-axis is in time format - Fix a bug in plotting error boxes when the input data set is in "points" and the x-axis is in time format (Thanks to Anthony Chan) - Add license session to Makefile.PL - Improve POD 0.09 - Support the "using" feature of Gnuplot - Force setting character encoding before setting terminal to avoid potential problem - Cleaner fix for the bug of the "command()" method 0.08 - Fix a bug that plotting data does not work in MSWin (Thanks to Anthony Tekatch) - Fix a bug that would generate redundant code when the "command()" method is called (Thanks to Anthony Tekatch) - Fix a typo in POD - Improve testsuite 0.07 - Support user-specified path of the convert program - Support plotting parametric functions - Fix a bug that range does not work if axis is date/time (Thanks to Holyspell) 0.06 - Support formatting legend - Fix an error that causes some options of one chart affects other charts in multiplot. - Fix an error in image format conversion. - Better support of MSWin 0.05 - Fix a bug in timestamp option. (Thanks to Lou King) - Fix a typo in POD 0.04 - Support adding time stamp - Support adding arbitrary labels - Create temporary file when the chart object is created 0.03 - Support financebars and candlesticks plotting styles - Support setting filling the boxes and candlesticks - Support setting style of the borders - Support plotting 3D graph from arrays of coordinates of data points - Support adding 3D data set to multiplot chart - Support setting of background color (experimental) - Support setting of plot area background color (experimental) - Plot in PS if the output file has no extension - Fix a bug of checking array lengths in error-type style - Update the POD 0.02 - Fix a bug that makes converting output figure to PDF failed - Fix a bug that makes printing certain error mesg failed - Add checking whether xdata and ydata array lengths are the same - Add more test cases - Remove some redundant code 0.01 Initial release Chart-Gnuplot-0.23/t/0000755000377200037720000000000012471026131013407 5ustar kwmakkwmakChart-Gnuplot-0.23/t/thaw_7.dat0000644000377200037720000000007512134242757015306 0ustar kwmakkwmak0 2 0 6 2 2 0 4 0 7 4 4 0 3 0 8 3 3 0 5 0 9 5 5 0 7 0 10 7 7 Chart-Gnuplot-0.23/t/copy.t0000755000377200037720000000573012122543114014554 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 4); BEGIN {use Chart::Gnuplot;} # Test copying Chart object { my $original = Chart::Gnuplot->new( output => "temp.ps", title => 'original', ); my $clone = $original->copy; $original->title("original title changed"); $clone->title("clone title"); $original->_setChart(); $clone->_setChart(); my $diff = 0; $diff += &diff($original->{_script}, "copy_1.gp"); $diff += &diff($clone->{_script}, "copy_2.gp"); ok($diff == 0); } # Test multi-copying Chart object { my $original = Chart::Gnuplot->new( output => "temp.ps", title => 'original', ); my @clone = $original->copy(3); # Modify objects after cloning $original->title("original title changed"); for (my $i = 0; $i < @clone; $i++) { $clone[$i]->title("clone title $i"); } # Write gnuplot script $original->_setChart(); for (my $i = 0; $i < @clone; $i++) { $clone[$i]->_setChart(); } # Check if there is difference my $diff = 0; $diff += &diff($original->{_script}, "copy_1.gp"); for (my $i = 0; $i < @clone; $i++) { my $j = $i+3; $diff += &diff($clone[$i]->{_script}, "copy_$j.gp"); } ok($diff == 0); } # Test copying DataSet object { my $original = Chart::Gnuplot::DataSet->new( func => 'sin(x)', style => 'points', ); my $clone = $original->copy; $original->func("cos(x)"); $clone->ydata([1 .. 10]); my $cos = $original->_thaw(); $clone->_thaw(); my $diff = 0; $diff++ if ($cos ne "cos(x) title \"\" with points"); $diff += &diff($clone->{_data}, "copy_1.dat"); ok($diff == 0); } # Test multi-copying DataSet object { my $original = Chart::Gnuplot::DataSet->new( func => 'sin(x)', title => "original" ); my @clone = $original->copy(3); # Modify objects after cloning $original->title("original title changed"); for (my $i = 0; $i < @clone; $i++) { $clone[$i]->title("clone title $i"); } # Save data my $origStr = $original->_thaw(); my (@cloneStr) = (); for (my $i = 0; $i < @clone; $i++) { push(@cloneStr, $clone[$i]->_thaw()); } # Check if there is difference my $diff = 0; $diff++ if ($origStr ne 'sin(x) title "original title changed"'); for (my $i = 0; $i < @clone; $i++) { $diff++ if ($cloneStr[$i] ne "sin(x) title \"clone title $i\"") } ok($diff == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/plotAxes.t0000755000377200037720000000167312133540765015416 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 1); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test default setting of the time stamp { my $c = Chart::Gnuplot->new( output => $temp, x2tics => 'on', y2tics => 'on', ); my $d = Chart::Gnuplot::DataSet->new( func => 'sin(x)', axes => 'x2y2', ); $c->_setChart([$d]); my $s = $d->_thaw($c); ok( &diff($c->{_script}, "plotAxes_1.gp") == 0 && $s eq 'sin(x) title "" axes x2y2' ); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/axisTics.t0000755000377200037720000000305212470252107015371 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 2); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test formatting the axis tics { my $c = Chart::Gnuplot->new( output => $temp, xtics => { labelfmt => '%.1g', font => 'arial,18', fontcolor => 'magenta', }, ytics => { labels => [-0.8, 0.3, 0.6], # specify tic labels rotate => '30', mirror => 'off', # no tic on y2 axis }, x2tics => [-8, -6, -2, 2, 5, 9], y2tics => { length => "4,2", # tic size minor => 4, # 2 minor tics between major tics }, ); $c->_setChart(); ok(&diff($c->{_script}, "axisTics_1.gp") == 0); } # Test manually-specified range of tic { my $c = Chart::Gnuplot->new( output => $temp, xtics => { incr => 10, }, ytics => { start => -100, incr => 5, end => 200, }, ); $c->_setChart(); ok(&diff($c->{_script}, "axisTics_2.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/background.t0000755000377200037720000000251412134214567015730 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 3); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test formatting the border { my $c = Chart::Gnuplot->new( output => $temp, bg => { color => '#a2a2ff', density => 0.3, }, ); $c->_setChart(); ok(&diff($c->{_script}, "background_1.gp") == 0); } # Test formatting the border { my $c = Chart::Gnuplot->new( output => $temp, plotbg => { color => '#a2a2ff', density => 0.3, }, ); $c->_setChart(); ok(&diff($c->{_script}, "background_2.gp") == 0); } # Test formatting the border { my $c = Chart::Gnuplot->new( output => $temp, bg => { color => '#a2a2ff', density => 0.3, }, plotbg => { color => '#FFDDDD', density => 0.2, }, ); $c->_setChart(); ok(&diff($c->{_script}, "background_3.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/copy_1.gp0000644000377200037720000000015212122543114015125 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set title "original title changed" noenhanced Chart-Gnuplot-0.23/t/thaw_2.dat0000644000377200037720000000004612134215142015263 0ustar kwmakkwmak0 5 0.5 1 4 0.4 2 3 0.1 3 2 0 4 1 0.3 Chart-Gnuplot-0.23/t/background_3.gp0000644000377200037720000000043212134204127016276 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set object rect from screen 0, screen 0 to screen 1, screen 1 fillcolor rgb "#a2a2ff" fillstyle solid 0.3 behind set object rect from graph 0, graph 0 to graph 1, graph 1 fillcolor rgb "#FFDDDD" fillstyle solid 0.2 behind Chart-Gnuplot-0.23/t/command.t0000755000377200037720000000202312134750720015216 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 2); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test the command method { my $c = Chart::Gnuplot->new( output => $temp, ); # A Gnuplot command $c->command("set size squre 0.5"); ok(&diff($c->{_script}, "command_1.gp") == 0); } # Test the command method { my $c = Chart::Gnuplot->new( output => $temp, ); # Array of Gnuplot commands $c->command([ "set size squre 0.5", "set parametric", ]); ok(&diff($c->{_script}, "command_2.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", @c1) eq join("", @c2)); return(1); } Chart-Gnuplot-0.23/t/dataSrc_3.dat0000644000377200037720000000020212122543114015674 0ustar kwmakkwmak# Plain text data file -10 20 -9 19 -8 18 -7 17 -6 16 -5 15 -4 14 -3 13 -2 12 -1 11 0 10 1 9 2 8 3 7 4 6 5 5 6 4 7 3 8 2 9 1 10 0 Chart-Gnuplot-0.23/t/axisLabel.t0000755000377200037720000000255712122543114015512 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 2); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test default setting of axis labels { my $c = Chart::Gnuplot->new( output => $temp, xlabel => 'x-label', ylabel => 'y-label', x2label => 'x2-label', y2label => 'y2-label', ); $c->_setChart(); ok(&diff($c->{_script}, "axisLabel_1.gp") == 0); } # Test formatting the axis labels { my $c = Chart::Gnuplot->new( output => $temp, xlabel => { text => "My axis label in {/Symbol-Oblique greek}", font => "Courier, 30", color => "pink", offset => "3,2", enhanced => "on", }, ylabel => { text => "Rotated 80 deg", rotate => 80, }, ); $c->_setChart(); ok(&diff($c->{_script}, "axisLabel_2.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/axisTics_2.gp0000644000377200037720000000013712470073161015754 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set xtics 10 set ytics 0-100,5,200 Chart-Gnuplot-0.23/t/timestamp_2.gp0000644000377200037720000000017112133520527016165 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set timestamp "%b %d %H:%M" offset 5,-1 font "Helvetica, 20" Chart-Gnuplot-0.23/t/datetime_1.gp0000644000377200037720000000014212133436227015756 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set xdata time set timefmt "%Y-%m-%d" Chart-Gnuplot-0.23/t/background_1.gp0000644000377200037720000000025512134204050016272 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set object rect from screen 0, screen 0 to screen 1, screen 1 fillcolor rgb "#a2a2ff" fillstyle solid 0.3 behind Chart-Gnuplot-0.23/t/chartTitle_2.gp0000644000377200037720000000024512122543114016262 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set title "My chart title in {/Symbol-Oblique greek}" offset 3,2 font "Courier, 30" textcolor rgb "pink" Chart-Gnuplot-0.23/t/thaw_9.dat0000644000377200037720000000003712134457621015304 0ustar kwmakkwmak"6" 2 "7" 4 "8" 3 "9" 5 "10" 7 Chart-Gnuplot-0.23/t/set_1.gp0000644000377200037720000000015512134750556014766 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set origin 0.1, 0.5 set tmargin 10 set lmargin 5 Chart-Gnuplot-0.23/t/label.t0000755000377200037720000000332412133543763014672 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 3); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test default setting of label { my $c = Chart::Gnuplot->new( output => $temp, ); $c->label( text => "Test label", position => "1, -2", ); $c->_setChart(); ok(&diff($c->{_script}, "label_1.gp") == 0); } # Test formatting label { my $c = Chart::Gnuplot->new( output => $temp, ); $c->label( text => "Test label", position => "1, -2", offset => "1.5, 0", pointtype => 5, pointsize => 3, pointcolor => 'blue', ); $c->_setChart(); ok(&diff($c->{_script}, "label_2.gp") == 0); } # Test multiple labels { my $c = Chart::Gnuplot->new( output => $temp, ); # Label 1 $c->label( text => "Test label 1", position => "2, -0.3", offset => "1.5, 0", pointtype => 5, pointsize => 3, pointcolor => 'blue', ); # Label 2 $c->label( text => "Test label 2", position => "-2, 0.3", pointtype => 'square', pointsize => 2, ); $c->_setChart(); ok(&diff($c->{_script}, "label_3.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/background_2.gp0000644000377200037720000000025112134204105016270 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set object rect from graph 0, graph 0 to graph 1, graph 1 fillcolor rgb "#a2a2ff" fillstyle solid 0.3 behind Chart-Gnuplot-0.23/t/range.t0000755000377200037720000000213012133433300014662 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 2); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test setting range in x, y, x2, y2 axes { my $c = Chart::Gnuplot->new( output => $temp, xrange => [-5, 5], yrange => ["-pi", "*"], x2range => ["*", 10], y2range => "[-2, 2]", ); $c->_setChart(); ok(&diff($c->{_script}, "range_1.gp") == 0); } # Test setting trange { my $c = Chart::Gnuplot->new( output => $temp, trange => [0, 40], urange => [-10, 20], vrange => [0, "*"], ); $c->_setChart(); ok(&diff($c->{_script}, "range_2.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/label_3.gp0000644000377200037720000000037212133543725015252 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set label "Test label 1" at 2, -0.3 offset 1.5, 0 noenhanced point pointtype 5 pointsize 3 linecolor rgb "blue" set label "Test label 2" at -2, 0.3 noenhanced point pointtype 64 pointsize 2 Chart-Gnuplot-0.23/t/thaw_3.dat0000644000377200037720000000006212134215731015266 0ustar kwmakkwmak0 5 7 4 6 1 4 6 3 5 2 3 5 2 4 3 2 4 1 3 4 1 3 0 2 Chart-Gnuplot-0.23/t/timestamp_1.gp0000644000377200037720000000011212133520514016153 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set timestamp Chart-Gnuplot-0.23/t/border_1.gp0000644000377200037720000000016612122543114015435 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set border linetype 3 linecolor rgb "#ff00ff" linewidth 2 Chart-Gnuplot-0.23/t/legend.t0000755000377200037720000000245612122543114015042 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 2); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test default setting of legend { my $d = Chart::Gnuplot::DataSet->new( func => "cos(x)", title => "cosine function", ); ok($d->_thaw() eq "cos(x) title \"cosine function\""); } # Test formatting the legend { my $c = Chart::Gnuplot->new( output => $temp, legend => { position => "outside center bottom", order => "horizontal reverse", align => 'left', width => 3, height => 4, title => 'Trigonometric functions', sample => {length => 10, position => 'left', spacing => 2}, border => 'on', }, ); $c->_setChart(); ok(&diff($c->{_script}, "legend_1.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/grid.t0000755000377200037720000000314312122543114014523 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 3); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test default setting of gridlines { my $c = Chart::Gnuplot->new( output => $temp, grid => 'on', ); $c->_setChart(); ok(&diff($c->{_script}, "grid_1.gp") == 0); } # Test formatting the gridlines { my $c = Chart::Gnuplot->new( output => $temp, grid => { xlines => "on, on", ylines => "on, off", linetyle => "longdash, dot-longdash", width => "2,1", }, ); $c->_setChart(); ok(&diff($c->{_script}, "grid_2.gp") == 0); } # Test setting major and minor gridlines { my $c = Chart::Gnuplot->new( output => $temp, grid => { xlines => "on", ylines => "on", linetyle => "longdash", width => "2", }, minorgrid => { xlines => "on", ylines => "off", linetyle => "dot-longdash", width => "1", }, ); $c->_setChart(); ok(&diff($c->{_script}, "grid_3.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/grid_3.gp0000644000377200037720000000027112122543114015104 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set grid xtics ytics ztics mxtics linetype 4 linewidth 2 linecolor rgb "black", linetype 4 linewidth 1 linecolor rgb "black" Chart-Gnuplot-0.23/t/grid_1.gp0000644000377200037720000000012112122543114015074 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set grid xtics ytics Chart-Gnuplot-0.23/t/label_1.gp0000644000377200037720000000014712133541544015245 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set label "Test label" at 1, -2 noenhanced Chart-Gnuplot-0.23/t/axisLabel_1.gp0000644000377200037720000000030012122543114016052 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set xlabel "x-label" noenhanced set ylabel "y-label" noenhanced set x2label "x2-label" noenhanced set y2label "y2-label" noenhanced Chart-Gnuplot-0.23/t/thaw_11.dat0000644000377200037720000000007312134706413015351 0ustar kwmakkwmak3 0 -2 3 1 2 3 2 6 4 0 -1 4 1 3 4 2 7 5 0 0 5 1 4 5 2 8 Chart-Gnuplot-0.23/t/command_2.gp0000644000377200037720000000004212134750061015574 0ustar kwmakkwmakset size squre 0.5 set parametric Chart-Gnuplot-0.23/t/timestamp.t0000755000377200037720000000212512134214604015602 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 2); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test default setting of the time stamp { my $c = Chart::Gnuplot->new( output => $temp, timestamp => '', ); $c->_setChart(); ok(&diff($c->{_script}, "timestamp_1.gp") == 0); } # Test formatting time stamp { my $c = Chart::Gnuplot->new( output => $temp, timestamp => { fmt => '%b %d %H:%M', font => 'Helvetica, 20', offset => '5,-1', }, ); $c->_setChart(); ok(&diff($c->{_script}, "timestamp_2.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/range_2.gp0000644000377200037720000000016312133433253015256 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set trange [0:40] set urange [-10:20] set vrange [0:*] Chart-Gnuplot-0.23/t/set.t0000755000377200037720000000150512134750621014377 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 1); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test the "set" method { my $c = Chart::Gnuplot->new( output => $temp, ); $c->set( origin => "0.1, 0.5", tmargin => 10, lmargin => 5, ); $c->_setChart(); ok(&diff($c->{_script}, "set_1.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/copy_5.gp0000644000377200037720000000014112122543114015127 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set title "clone title 2" noenhanced Chart-Gnuplot-0.23/t/thaw_6.dat0000644000377200037720000000006312134242121015263 0ustar kwmakkwmak6 5 7 4 6 7 4 6 3 5 8 3 5 2 4 9 2 4 1 3 10 1 3 0 2 Chart-Gnuplot-0.23/t/chartTitle.t0000755000377200037720000000227212122543114015703 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 2); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test default setting of chart title { my $c = Chart::Gnuplot->new( output => $temp, title => "My chart title", ); $c->_setChart(); ok(&diff($c->{_script}, "chartTitle_1.gp") == 0); } # Test formatting the chart title { my $c = Chart::Gnuplot->new( output => $temp, title => { text => "My chart title in {/Symbol-Oblique greek}", font => "Courier, 30", color => "pink", offset => "3,2", enhanced => "on", }, ); $c->_setChart(); ok(&diff($c->{_script}, "chartTitle_2.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/lineStyle.t0000755000377200037720000000063212133305244015550 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 1); BEGIN {use Chart::Gnuplot;} # Test formatting the line style { my $d = Chart::Gnuplot::DataSet->new( func => "sin(x)", style => "linespoints", color => "blue", linetype => "dash", width => 3, ); my $s = $d->_thaw(); ok($s eq 'sin(x) title "" with linespoints linetype 3 '. 'linecolor rgb "blue" linewidth 3'); } Chart-Gnuplot-0.23/t/plotAxes_1.gp0000644000377200037720000000012212133540564015757 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set x2tics set y2tics Chart-Gnuplot-0.23/t/chartTitle_1.gp0000644000377200037720000000014212122543114016255 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set title "My chart title" noenhanced Chart-Gnuplot-0.23/t/thaw_5.dat0000644000377200037720000000007112134220656015272 0ustar kwmakkwmak6 5 0.5 0.1 7 4 0.4 0.2 8 3 0.1 0 9 2 0 0.4 10 1 0.3 0.3 Chart-Gnuplot-0.23/t/copy_1.dat0000644000377200037720000000005112122543114015265 0ustar kwmakkwmak0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 Chart-Gnuplot-0.23/t/label_2.gp0000644000377200037720000000025012133543233015236 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set label "Test label" at 1, -2 offset 1.5, 0 noenhanced point pointtype 5 pointsize 3 linecolor rgb "blue" Chart-Gnuplot-0.23/t/thaw.t0000755000377200037720000001545712134751751014567 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 17); BEGIN {use Chart::Gnuplot;} # Test plotting from Perl arrays of y coordinates only { my @y = (6 .. 10); my $d = Chart::Gnuplot::DataSet->new( ydata => \@y, ); $d->_thaw(); ok(&diff($d->{_data}, "thaw_1.dat") == 0); } # Test plotting yerrorbars from Perl arrays of y coordinates only { my @y = (5, 4, 3, 2, 1); my @err = (0.5, 0.4, 0.1, 0, 0.3); my $d = Chart::Gnuplot::DataSet->new( ydata => [[@y], [@err]], style => 'yerrorbars', ); $d->_thaw(); ok(&diff($d->{_data}, "thaw_2.dat") == 0); } # Test plotting financebars from Perl arrays of y coordinates only { my @open = (5, 4, 3, 2, 1); my @high = (7, 6, 5, 4, 3); my @low = (4, 3, 2, 1, 0); my @close = (6, 5, 4, 3, 2); my $d = Chart::Gnuplot::DataSet->new( ydata => [\@open, \@high, \@low, \@close], style => 'financebars', ); $d->_thaw(); ok(&diff($d->{_data}, "thaw_3.dat") == 0); } # Test plotting xerrorbars from Perl arrays of x and y coordinates { my @x = (6, 7, 8, 9, 10); my @y = (5, 4, 3, 2, 1); my @err = (0.5, 0.4, 0.1, 0, 0.3); my $d = Chart::Gnuplot::DataSet->new( xdata => [[@x], [@err]], ydata => \@y, style => 'xerrorbars', ); $d->_thaw(); ok(&diff($d->{_data}, "thaw_4.dat") == 0); } # Test plotting yerrorbars from Perl arrays of x and y coordinates { my @x = (6, 7, 8, 9, 10); my @y = (5, 4, 3, 2, 1); my @err = (0.5, 0.4, 0.1, 0, 0.3); my $d = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => [[@y], [@err]], style => 'yerrorbars', ); $d->_thaw(); ok(&diff($d->{_data}, "thaw_4.dat") == 0); } # Test plotting xyerrorbars from Perl arrays of x and y coordinates { my @x = (6, 7, 8, 9, 10); my @y = (5, 4, 3, 2, 1); my @xerr = (0.5, 0.4, 0.1, 0, 0.3); my @yerr = (0.1, 0.2, 0, 0.4, 0.3); my $d = Chart::Gnuplot::DataSet->new( xdata => [[@x], [@xerr]], ydata => [[@y], [@yerr]], style => 'xyerrorbars', ); $d->_thaw(); ok(&diff($d->{_data}, "thaw_5.dat") == 0); } # Test plotting financebars from Perl arrays of x and y coordinates { my @x = (6, 7, 8, 9, 10); my @open = (5, 4, 3, 2, 1); my @high = (7, 6, 5, 4, 3); my @low = (4, 3, 2, 1, 0); my @close = (6, 5, 4, 3, 2); my $d = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => [\@open, \@high, \@low, \@close], style => 'financebars', ); $d->_thaw(); ok(&diff($d->{_data}, "thaw_6.dat") == 0); } # Test plotting hlines from Perl arrays of x and y coordinates { my @x = (6, 7, 8, 9, 10); my @y = (2, 4, 3, 5, 7); my $d = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, style => 'hlines', ); my $s = $d->_thaw(); ok(&diff($d->{_data}, "thaw_7.dat") == 0 && $s =~ /with boxxyerrorbars$/); } # Test plotting hbars from Perl arrays of x and y coordinates { my @x = (6, 7, 8, 9, 10); my @y = (2, 4, 3, 5, 7); my $d = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, style => 'hbars', ); my $s = $d->_thaw(); ok(&diff($d->{_data}, "thaw_8.dat") == 0 && $s =~ /with boxxyerrorbars$/); } # Test plotting histogram from Perl arrays of x and y coordinates { my @x = (6, 7, 8, 9, 10); my @y = (2, 4, 3, 5, 7); my $d = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, style => 'histograms', ); my $s = $d->_thaw(); ok(&diff($d->{_data}, "thaw_9.dat") == 0 && $s =~ /using 2:xticlabels\(1\) title "" with histograms$/); } # Test plotting from Perl arrays of x, y and z coordinates { my @x = (6, 7, 8, 9, 10); my @y = (2, 4, 3, 5, 7); my @z = (-2, -2, 0, 1, -1); my $d = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, zdata => \@z, ); $d->_thaw(); ok(&diff($d->{_data}, "thaw_10.dat") == 0); } # Test plotting 3D surface from Perl arrays of x, y and z coordinates { my @x = ( [3, 3, 3], [4, 4, 4], [5, 5, 5], ); my @y = ( [0, 1, 2], [0, 1, 2], [0, 1, 2], ); my @z = ( [-2, 2, 6], [-1, 3, 7], [ 0, 4, 8], ); my $d = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, zdata => \@z, ); $d->_thaw(); ok(&diff($d->{_data}, "thaw_11.dat") == 0); } # Test plotting hlines from Perl array of points { my @p = ( [6, 2], [7, 4], [8, 3], [9, 5], [10, 7], ); my $d = Chart::Gnuplot::DataSet->new( points => \@p, style => 'hlines', ); my $s = $d->_thaw(); ok(&diff($d->{_data}, "thaw_7.dat") == 0 && $s =~ /with boxxyerrorbars$/); } # Test plotting hbars from Perl array of points { my @p = ( [6, 2], [7, 4], [8, 3], [9, 5], [10, 7], ); my $d = Chart::Gnuplot::DataSet->new( points => \@p, style => 'hbars', ); my $s = $d->_thaw(); ok(&diff($d->{_data}, "thaw_8.dat") == 0 && $s =~ /with boxxyerrorbars$/); } # Test plotting histogram from Perl array of points { my @p = ( [6, 2], [7, 4], [8, 3], [9, 5], [10, 7], ); my $d = Chart::Gnuplot::DataSet->new( points => \@p, style => 'histograms', ); my $s = $d->_thaw(); ok(&diff($d->{_data}, "thaw_9.dat") == 0 && $s =~ /using 2:xticlabels\(1\) title "" with histograms$/); } # Test plotting 3D surface from Perl array of points { my @p = ( [ [3, 0, -2], [3, 1, 2], [3, 2, 6], ], [ [4, 0, -1], [4, 1, 3], [4, 2, 7], ], [ [5, 0, 0], [5, 1, 4], [5, 2, 8], ], ); my $d = Chart::Gnuplot::DataSet->new( points => \@p, ); $d->_thaw(); ok(&diff($d->{_data}, "thaw_11.dat") == 0); } # Test smoothing the data points { my @x = (6, 7, 8, 9, 10); my @y = (2, 4, 3, 5, 7); my $d = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, style => 'lines', smooth => 'csplines', ); my $s = $d->_thaw(); ok($s =~ /smooth csplines/); } ################################################################### # Compare two files # - return 0 if two files are exactly the same # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", @c1) eq join("", @c2)); return(1); } Chart-Gnuplot-0.23/t/pointStyle.t0000755000377200037720000000056112133427504015757 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 1); BEGIN {use Chart::Gnuplot;} # Test formatting the line style { my $d = Chart::Gnuplot::DataSet->new( func => "sin(x)", style => "linespoints", pointsize => 3, pointtype => "circle", ); my $s = $d->_thaw(); ok($s eq 'sin(x) title "" with linespoints pointtype 65 pointsize 3'); } Chart-Gnuplot-0.23/t/chartDim.t0000755000377200037720000000173712134723422015345 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 4); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test setting the orientation { my $c = Chart::Gnuplot->new( output => $temp, orient => 'portrait', ); $c->_setChart(); ok($c->{terminal} =~ /portrait$/); } # Test setting image size { my $c = Chart::Gnuplot->new( output => $temp, imagesize => "0.9, 1.1", ); $c->_setChart(); ok($c->{terminal} =~ /size 9,7\.7$/); } # Test setting image size of portrait image { my $c = Chart::Gnuplot->new( output => $temp, orient => 'portrait', imagesize => "0.9, 1.1", ); $c->_setChart(); ok($c->{terminal} =~ /portrait size 6\.3,11$/); } # Test setting image size with specified unit { my $c = Chart::Gnuplot->new( output => $temp, imagesize => "18 cm, 4 inches", ); $c->_setChart(); ok($c->{terminal} =~ /size 18 cm,4 inches$/); } Chart-Gnuplot-0.23/t/use.t0000755000377200037720000000020312133277033014372 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 2); BEGIN { use_ok('Chart::Gnuplot'); use_ok('Chart::Gnuplot::Util'); } Chart-Gnuplot-0.23/t/command_1.gp0000644000377200037720000000002312134747724015606 0ustar kwmakkwmakset size squre 0.5 Chart-Gnuplot-0.23/t/axisLabel_2.gp0000644000377200037720000000033112122543114016057 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set xlabel "My axis label in {/Symbol-Oblique greek}" offset 3,2 font "Courier, 30" textcolor rgb "pink" set ylabel "Rotated 80 deg" noenhanced rotate by 80 Chart-Gnuplot-0.23/t/thaw_4.dat0000644000377200037720000000004712134220151015262 0ustar kwmakkwmak6 5 0.5 7 4 0.4 8 3 0.1 9 2 0 10 1 0.3 Chart-Gnuplot-0.23/t/range_1.gp0000644000377200037720000000021012133432752015251 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set xrange [-5:5] set yrange [-pi:*] set x2range [*:10] set y2range [-2, 2] Chart-Gnuplot-0.23/t/border.t0000755000377200037720000000227212122543114015055 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 2); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test formatting the border { my $c = Chart::Gnuplot->new( output => $temp, border => { linetype => 3, width => 2, color => '#ff00ff', }, ); $c->_setChart(); ok(&diff($c->{_script}, "border_1.gp") == 0); } # Test formatting the specified borders { my $c = Chart::Gnuplot->new( output => $temp, border => { sides => "left, bottom", linetype => 3, width => 2, color => '#ff00ff', }, ); $c->_setChart(); ok(&diff($c->{_script}, "border_2.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/grid_2.gp0000644000377200037720000000030012122543114015074 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set grid xtics ytics ztics mxtics mytics linetype 4 linewidth 2 linecolor rgb "black", linetype 4 linewidth 1 linecolor rgb "black" Chart-Gnuplot-0.23/t/thaw_10.dat0000644000377200037720000000004212134460456015350 0ustar kwmakkwmak6 2 -2 7 4 -2 8 3 0 9 5 1 10 7 -1 Chart-Gnuplot-0.23/t/copy_4.gp0000644000377200037720000000014112122543114015126 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set title "clone title 1" noenhanced Chart-Gnuplot-0.23/t/dataSrc_2.dat0000644000377200037720000000003012122543114015672 0ustar kwmakkwmak1 2 3 1 5 0 6 1 7 2 9 3 Chart-Gnuplot-0.23/t/border_2.gp0000644000377200037720000000017012122543114015431 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set border 3 linetype 3 linecolor rgb "#ff00ff" linewidth 2 Chart-Gnuplot-0.23/t/axisTics_1.gp0000644000377200037720000000036012122543114015743 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set xtics font "arial,18" textcolor rgb "magenta" set format x "%.1g" set y2tics scale 4,2 set my2tics 5 set x2tics (-8,-6,-2,2,5,9) set ytics nomirror rotate by 30 (-0.8,0.3,0.6) Chart-Gnuplot-0.23/t/datetime_2.gp0000644000377200037720000000020112133516550015751 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set xdata time set xtics set format x "%b %y" set timefmt "%Y-%m-%d" Chart-Gnuplot-0.23/t/datetime.t0000755000377200037720000000243612133516571015407 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 2); BEGIN {use Chart::Gnuplot;} my $temp = "temp.ps"; # Test input date in time format { my $c = Chart::Gnuplot->new( output => $temp, timeaxis => 'x', ); my $d = Chart::Gnuplot::DataSet->new( xdata => ['2012-02-26'], ydata => [1], timefmt => '%Y-%m-%d', ); $c->_setChart([$d]); ok(&diff($c->{_script}, "datetime_1.gp") == 0); } # Test changing date-time format { my $c = Chart::Gnuplot->new( output => $temp, timeaxis => 'x', xtics => {labelfmt => '%b %y'}, ); my $d = Chart::Gnuplot::DataSet->new( xdata => ['2012-02-26'], ydata => [1], timefmt => '%Y-%m-%d', ); $c->_setChart([$d]); ok(&diff($c->{_script}, "datetime_2.gp") == 0); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/thaw_1.dat0000644000377200037720000000002512134213750015262 0ustar kwmakkwmak0 6 1 7 2 8 3 9 4 10 Chart-Gnuplot-0.23/t/copy_3.gp0000644000377200037720000000014112122543114015125 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set title "clone title 0" noenhanced Chart-Gnuplot-0.23/t/copy_2.gp0000644000377200037720000000013712122543114015131 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set title "clone title" noenhanced Chart-Gnuplot-0.23/t/dataSrc_1.dat0000644000377200037720000000015312122543114015677 0ustar kwmakkwmak-10 0 -9 1 -8 2 -7 3 -6 4 -5 5 -4 6 -3 7 -2 8 -1 9 0 10 1 11 2 12 3 13 4 14 5 15 6 16 7 17 8 18 9 19 10 20 Chart-Gnuplot-0.23/t/legend_1.gp0000644000377200037720000000031612122543114015413 0ustar kwmakkwmakset terminal postscript enhanced color set output "temp.ps" set key outside center bottom width 3 height 4 Left horizontal invert title "Trigonometric functions" noenhanced samplen 10 reverse spacing 2 box Chart-Gnuplot-0.23/t/dataSrc.t0000755000377200037720000000461412134713140015164 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Test::More (tests => 6); BEGIN {use Chart::Gnuplot;} # Test plotting from Perl arrays of x coordinates and y coordinates { my @x = (-10 .. 10); my @y = (0 .. 20); my $d = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, ); $d->_thaw(); ok(&diff($d->{_data}, "dataSrc_1.dat") == 0); } # Test plotting from Perl array of x-y pairs { my @xy = ( [1, 2], [3, 1], [5, 0], [6, 1], [7, 2], [9, 3], ); my $d = Chart::Gnuplot::DataSet->new( points => \@xy, ); $d->_thaw(); ok(&diff($d->{_data}, "dataSrc_2.dat") == 0); } # Test plotting from data file { my $infile = "dataSrc_3.dat"; $infile = "t/".$infile if (!-e $infile); my $d = Chart::Gnuplot::DataSet->new( datafile => $infile, ); my $string = $d->_thaw(); ok($string eq "'$infile' title \"\""); } # Test plotting from mathematical expression { my $d = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); my $string = $d->_thaw(); ok($string eq 'sin(x) title ""'); } # Test plotting 2D parametric function { my $c = Chart::Gnuplot->new( output => "temp.ps", ); my $d = Chart::Gnuplot::DataSet->new( func => { x => 'sin(t)', y => 'cos(t)', }, ); $c->_setChart([$d]); my $s = $d->_thaw(); ok($s eq 'sin(t),cos(t) title ""' && defined $c->{parametric}); } # Test plotting 3D parametric function { my $c = Chart::Gnuplot->new( output => "temp.ps", ); # A torus my $d = Chart::Gnuplot::DataSet->new( func => { x => 'cos(u)*(4+cos(v))', y => 'sin(u)*(4+cos(v))', z => 'sin(v)', }, ); $c->_setChart([$d]); my $s = $d->_thaw(); ok($s eq 'cos(u)*(4+cos(v)),sin(u)*(4+cos(v)),sin(v) title ""' && defined $c->{parametric}); } ################################################################### # Compare two files # - return 0 if two files are the same, except the ordering of the lines # - return 1 otherwise sub diff { my ($f1, $f2) = @_; $f2 = "t/".$f2 if (!-e $f2); open(F1, $f1) || return(1); open(F2, $f2) || return(1); my @c1 = ; my @c2 = ; close(F1); close(F2); return(0) if (join("", sort @c1) eq join("", sort @c2)); return(1); } Chart-Gnuplot-0.23/t/thaw_8.dat0000644000377200037720000000011312134457526015302 0ustar kwmakkwmak0 2 0 6 1.5 2.5 0 3 0 8 2.5 3.5 0 4 0 7 3.5 4.5 0 5 0 9 4.5 6 0 7 0 10 6 8 Chart-Gnuplot-0.23/Makefile.PL0000644000377200037720000000073212122543114015116 0ustar kwmakkwmakuse ExtUtils::MakeMaker; WriteMakefile( AUTHOR => 'Ka-Wai Mak', NAME => 'Chart::Gnuplot', VERSION_FROM => 'lib/Chart/Gnuplot.pm', ABSTRACT_FROM => "lib/Chart/Gnuplot.pm", PREREQ_PM => { Carp => 1.04, File::Copy => 2.08, File::Temp => 0.14, Storable => 2.15, }, dist => { SUFFIX => '.gz', COMPRESS => 'gzip -f' }, ($ExtUtils::MakeMaker::VERSION > 6.48)? (LICENSE => "perl"): (), ); Chart-Gnuplot-0.23/MANIFEST0000644000377200037720000000700312471025154014301 0ustar kwmakkwmaklib/Chart/Gnuplot.pm lib/Chart/Gnuplot/Util.pm doc/colors.txt doc/linetypes.txt doc/pointtypes.txt examples/Makefile examples/README examples/axisLabel_1.pl examples/axisLabel_2.pl examples/axisLabel_3.pl examples/axisLabel_4.pl examples/axisLabel_5.pl examples/axisLabel_6.pl examples/axisLabel_7.pl examples/axisLabel_8.pl examples/axisTics_1.pl examples/axisTics_2.pl examples/axisTics_3.pl examples/axisTics_4.pl examples/axisTics_5.pl examples/axisTics_6.pl examples/axisTics_7.pl examples/axisTics_8.pl examples/axisTics_9.pl examples/axisTics_10.pl examples/axisTics_11.pl examples/axisTics_12.pl examples/axisTics_13.pl examples/background_1.pl examples/background_2.pl examples/border_1.pl examples/border_2.pl examples/border_3.pl examples/chartDim_1.pl examples/chartDim_2.pl examples/chartDim_3.pl examples/chartFmt_1.pl examples/chartFmt_2.pl examples/chartFmt_3.pl examples/chartFmt_4.pl examples/chartTitle_1.pl examples/chartTitle_2.pl examples/chartTitle_3.pl examples/chartTitle_4.pl examples/chartTitle_5.pl examples/chartTitle_6.pl examples/chartTitle_7.pl examples/chartTitle_8.pl examples/dataSrc_1.pl examples/dataSrc_2.pl examples/dataSrc_3.pl examples/dataSrc_4.pl examples/dataSrc_5.pl examples/dataSrc_6.pl examples/datetime_1.pl examples/datetime_2.pl examples/datetime_3.pl examples/grid_1.pl examples/grid_2.pl examples/grid_3.pl examples/grid_4.pl examples/grid_5.pl examples/grid_6.pl examples/grid_7.pl examples/grid_8.pl examples/grid_9.pl examples/legend_1.pl examples/legend_2.pl examples/legend_3.pl examples/legend_4.pl examples/legend_5.pl examples/legend_6.pl examples/legend_7.pl examples/legend_8.pl examples/legend_9.pl examples/legend_10.pl examples/lineStyle_1.pl examples/lineStyle_2.pl examples/lineStyle_3.pl examples/lineStyle_4.pl examples/lineStyle_5.pl examples/multiplot_1.pl examples/multiplot_2.pl examples/multiplot_3.pl examples/plot3d_1.pl examples/plot3d_2.pl examples/plot3d_3.pl examples/plot3d_4.pl examples/plotAxes_1.pl examples/plotAxes_2.pl examples/plotStyle_1.pl examples/plotStyle_2.pl examples/plotStyle_3.pl examples/plotStyle_4.pl examples/plotStyle_5.pl examples/plotStyle_6.pl examples/plotStyle_7.pl examples/plotStyle_8.pl examples/plotStyle_9.pl examples/plotStyle_10.pl examples/plotStyle_11.pl examples/plotStyle_12.pl examples/plotStyle_13.pl examples/plotStyle_14.pl examples/plotStyle_15.pl examples/range_1.pl examples/range_2.pl examples/range_3.pl examples/index.html examples/list.html examples/main.html examples/dataSrc_3.dat examples/plot3d_3.dat t/axisLabel_1.gp t/axisLabel_2.gp t/axisLabel.t t/axisTics_1.gp t/axisTics_2.gp t/axisTics.t t/background_1.gp t/background_2.gp t/background_3.gp t/background.t t/border_1.gp t/border_2.gp t/border.t t/chartDim.t t/chartTitle_1.gp t/chartTitle_2.gp t/chartTitle.t t/command_1.gp t/command_2.gp t/command.t t/copy_1.dat t/copy_1.gp t/copy_2.gp t/copy_3.gp t/copy_4.gp t/copy_5.gp t/copy.t t/dataSrc_1.dat t/dataSrc_2.dat t/dataSrc_3.dat t/dataSrc.t t/datetime_1.gp t/datetime_2.gp t/datetime.t t/grid_1.gp t/grid_2.gp t/grid_3.gp t/grid.t t/label_1.gp t/label_2.gp t/label_3.gp t/label.t t/legend_1.gp t/legend.t t/lineStyle.t t/plotAxes_1.gp t/plotAxes.t t/pointStyle.t t/range_1.gp t/range_2.gp t/range.t t/set_1.gp t/set.t t/thaw_1.dat t/thaw_2.dat t/thaw_3.dat t/thaw_4.dat t/thaw_5.dat t/thaw_6.dat t/thaw_7.dat t/thaw_8.dat t/thaw_9.dat t/thaw_10.dat t/thaw_11.dat t/thaw.t t/timestamp_1.gp t/timestamp_2.gp t/timestamp.t t/use.t Changes README MANIFEST Makefile.PL META.yml Module meta-data (added by MakeMaker) Chart-Gnuplot-0.23/META.yml0000664000377200037720000000114212471026132014416 0ustar kwmakkwmak--- #YAML:1.0 name: Chart-Gnuplot version: 0.23 abstract: Plot graph using Gnuplot in Perl on the fly author: - Ka-Wai Mak license: perl distribution_type: module configure_requires: ExtUtils::MakeMaker: 0 build_requires: ExtUtils::MakeMaker: 0 requires: Carp: 1.04 File::Copy: 2.08 File::Temp: 0.14 Storable: 2.15 no_index: directory: - t - inc generated_by: ExtUtils::MakeMaker version 6.57_05 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 Chart-Gnuplot-0.23/README0000644000377200037720000000072512134770747014047 0ustar kwmakkwmakDescription =========== Plot graph using Gnuplot in Perl on the fly Build and install ================= perl Makefile.PL make make test make install Prerequisites ============= Carp v 1.04 or later File::Copy v2.08 or later File::Temp v0.14 or later Storable v2.15 or later Copyright ========= Copyright (c) 2008-2011, 2013 Ka-Wai Mak. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Chart-Gnuplot-0.23/examples/0000755000377200037720000000000012471026131014762 5ustar kwmakkwmakChart-Gnuplot-0.23/examples/legend_4.pl0000755000377200037720000000131612122543115017003 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demonstration of formatting legend # - formatting the legend border my $chart = Chart::Gnuplot->new( output => "gallery/legend_4.png", legend => { border => { linetype => 2, width => 2, color => "navy", }, }, ); # Lines my $lines = Chart::Gnuplot::DataSet->new( func => "cos(x)", title => "cosine", ); # Points my $points = Chart::Gnuplot::DataSet->new( func => "sin(x)", title => "sine", ); # Points on line my $linespoints = Chart::Gnuplot::DataSet->new( func => "x**2", title => "quadratic", ); # Plot the graph $chart->plot2d($lines, $points, $linespoints); Chart-Gnuplot-0.23/examples/dataSrc_5.pl0000755000377200037720000000074312122543116017133 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Chart object my $chart = Chart::Gnuplot->new( output => "gallery/dataSrc_5.png", ); # Data set object # - parametric function: a circle my $circle = Chart::Gnuplot::DataSet->new( func => {x => 'sin(t)', y => 'cos(t)'}, title => 'circle', ); # Vertical straight line my $vertical = Chart::Gnuplot::DataSet->new( func => {x => 0, y => 't'}, title => 'vertical line', ); $chart->plot2d($circle, $vertical); Chart-Gnuplot-0.23/examples/grid_4.pl0000755000377200037720000000040612122543115016471 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/grid_4.png", grid => { width => 3 } ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/plotStyle_6.pl0000755000377200037720000000156712122543115017556 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/plotStyle_6.png", title => "Joining points with steps", ); # steps and fsteps styles my @y = (1, 2, 0, 3, 2, -1, 2, 0, 2, 4); my $line_1 = Chart::Gnuplot::DataSet->new( ydata => [@y], style => "points", ); my $steps = Chart::Gnuplot::DataSet->new( ydata => [@y], style => "steps", title => "steps" ); my $fsteps = Chart::Gnuplot::DataSet->new( ydata => [@y], style => "fsteps", title => "fsteps", ); # histeps style @y = (-5, -6, -8, -4, -7, -5, -3, -1, -4); my $line_2 = Chart::Gnuplot::DataSet->new( ydata => [@y], style => "points", ); my $histeps = Chart::Gnuplot::DataSet->new( ydata => [@y], style => "histeps", title => "histeps", ); # Plot the graph $chart->plot2d($line_1, $steps, $fsteps, $line_2, $histeps); Chart-Gnuplot-0.23/examples/axisLabel_4.pl0000755000377200037720000000047012122543115017451 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisLabel_4.png", ylabel => { text => "Arial axis label", font => "arial", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/axisTics_12.pl0000755000377200037720000000044612122543115017416 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisTics_12.png", title => "Turn on the tics on the y2-axis", y2tics => "on", ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/legend_8.pl0000755000377200037720000000121412122543114017003 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demonstration of formatting legend # - alignment my $chart = Chart::Gnuplot->new( output => "gallery/legend_8.png", title => "Left alignment of the label", legend => { align => 'left', }, ); # Lines my $lines = Chart::Gnuplot::DataSet->new( func => "cos(x)", title => "cosine", ); # Points my $points = Chart::Gnuplot::DataSet->new( func => "sin(x)", title => "sine", ); # Points on line my $linespoints = Chart::Gnuplot::DataSet->new( func => "x**2", title => "quadratic", ); # Plot the graph $chart->plot2d($lines, $points, $linespoints); Chart-Gnuplot-0.23/examples/chartTitle_3.pl0000755000377200037720000000047412122543115017653 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/chartTitle_3.png", title => { text => "User specified font", font => "Courier", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/dataSrc_1.pl0000755000377200037720000000051412122543115017122 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Input data source my @x = (-10 .. 10); my @y = (0 .. 20); # Chart object my $chart = Chart::Gnuplot->new( output => "gallery/dataSrc_1.png", ); # Data set object my $dataSet = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/border_2.pl0000755000377200037720000000047212122543115017022 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/border_2.png", title => "Line width of the graph border", border => { width => 2, }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/grid_3.pl0000755000377200037720000000047212122543115016473 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/grid_3.png", title => "Grid lines in longdash", grid => { linetype => "longdash" } ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/chartTitle_2.pl0000755000377200037720000000047512122543115017653 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/chartTitle_2.png", title => { text => "Shifted chart title", offset => "3, 2", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/background_1.pl0000755000377200037720000000054712122543115017666 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/background_1.png", title => "Filling background color in the chart", bg => { color => "#c9c9ff", density => 0.2, }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/axisTics_7.pl0000755000377200037720000000046312122543115017341 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisTics_7.png", xlabel => "Red tic label", xtics => { fontcolor => "red", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/border_3.pl0000755000377200037720000000050212122543115017015 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/border_3.png", title => "Line color of the graph border", border => { color => '#ff00ff', }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/grid_5.pl0000755000377200037720000000041412122543115016471 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/grid_5.png", grid => { color => 'blue' }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/axisLabel_2.pl0000755000377200037720000000051512122543115017447 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisLabel_2.png", xlabel => { text => "Shifted rightwards and downwards", offset => "10, -2", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/plotStyle_11.pl0000755000377200037720000000151012122543115017616 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demo of the finance bars plotting style # Initiate the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/plotStyle_11.png', ); # Raw data my @t = (0 .. 100); my (@op, @hi, @lo, @cl) = (); $op[0] = 100; # open price $hi[0] = $op[0] + rand()/5; # high price $lo[0] = $op[0] - rand()/5; # low price $cl[0] = ($op[0]+$hi[0]+$lo[0])/3; # close price foreach my $i (1 .. $#t) { $op[$i] = $cl[$i-1] + (rand()-0.5)/2; $hi[$i] = $op[$i] + rand()/5; $lo[$i] = $op[$i] - rand()/5; $cl[$i] = ($op[$i]+$hi[$i]+$lo[$i])/3; } # Plot the data my $timeSeries = Chart::Gnuplot::DataSet->new( xdata => \@t, ydata => [\@op, \@hi, \@lo, \@cl], style => 'financebars', ); # Plot the graph $chart->plot2d($timeSeries); Chart-Gnuplot-0.23/examples/plotStyle_1.pl0000755000377200037720000000111612122543116017540 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/plotStyle_1.png", ); # Lines my $lines = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "lines", title => "lines", ); # Points my $points = Chart::Gnuplot::DataSet->new( func => "sin(x)", style => "points", title => "points", ); # Points on line my $linespoints = Chart::Gnuplot::DataSet->new( func => "-atan(x)", style => "linespoints", title => "linespoints", ); # Plot the graph $chart->plot2d($lines, $points, $linespoints); Chart-Gnuplot-0.23/examples/range_1.pl0000755000377200037720000000043312122543115016635 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/range_1.png", xlabel => "From -pi to pi", xrange => ["-pi", "pi"], ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/dataSrc_3.dat0000644000377200037720000000020212122543115017250 0ustar kwmakkwmak# Plain text data file -10 20 -9 19 -8 18 -7 17 -6 16 -5 15 -4 14 -3 13 -2 12 -1 11 0 10 1 9 2 8 3 7 4 6 5 5 6 4 7 3 8 2 9 1 10 0 Chart-Gnuplot-0.23/examples/legend_2.pl0000755000377200037720000000115712122543115017004 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demonstration of formatting legend # - position of the legend my $chart = Chart::Gnuplot->new( output => "gallery/legend_2.png", legend => { position => 'left', }, ); # Lines my $lines = Chart::Gnuplot::DataSet->new( func => "cos(x)", title => "cosine", ); # Points my $points = Chart::Gnuplot::DataSet->new( func => "sin(x)", title => "sine", ); # Points on line my $linespoints = Chart::Gnuplot::DataSet->new( func => "x**2", title => "quadratic", ); # Plot the graph $chart->plot2d($lines, $points, $linespoints); Chart-Gnuplot-0.23/examples/datetime_1.pl0000755000377200037720000000125012122543114017332 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Date array my @x = qw( 2007-01-01 2007-01-10 2007-01-24 2007-02-01 2007-02-14 2007-02-28 2007-03-05 2007-03-13 2007-03-21 2007-03-31 ); my @y = (1 .. 10); # Create the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/datetime_1.png', xlabel => 'Date axis', timeaxis => "x", # declare that x-axis uses time format ); # Data set object my $data = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, style => 'linespoints', timefmt => '%Y-%m-%d', # input time format ); # Plot the graph $chart->plot2d($data); Chart-Gnuplot-0.23/examples/multiplot_1.pl0000755000377200037720000000275112122543115017577 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; #---------------------------------------- # Demonstrate how to plot multiplot chart # - Use "add"-"multiplot" method pair #---------------------------------------- my $multiChart = Chart::Gnuplot->new( output => "gallery/multiplot_1.png", title => "Multiplot chart", ); #---------------------------------------- # Top left chart my @charts = (); $charts[0][0] = Chart::Gnuplot->new( title => "Top left chart", ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $charts[0][0]->add2d($dataSet); #---------------------------------------- #---------------------------------------- # Top right chart $charts[0][1] = Chart::Gnuplot->new( title => "Top right chart", ); $dataSet = Chart::Gnuplot::DataSet->new( func => "cos(x)", ); $charts[0][1]->add2d($dataSet); #---------------------------------------- #---------------------------------------- # Bottom left chart $charts[1][0] = Chart::Gnuplot->new( title => "Bottom left chart", ); $dataSet = Chart::Gnuplot::DataSet->new( func => "exp(x)", ); $charts[1][0]->add2d($dataSet); #---------------------------------------- #---------------------------------------- # Bottom right chart $charts[1][1] = Chart::Gnuplot->new( title => "Bottom right chart", ); $dataSet = Chart::Gnuplot::DataSet->new( func => "log(x)", ); $charts[1][1]->add2d($dataSet); #---------------------------------------- # Plot the multplot chart $multiChart->multiplot(\@charts); Chart-Gnuplot-0.23/examples/axisLabel_8.pl0000755000377200037720000000052712122543115017460 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisLabel_8.png", xlabel => { text => "Label with greek {/Symbol-Oblique letters}", enhanced => 'on', }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/axisTics_10.pl0000755000377200037720000000050512122543115017410 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisTics_10.png", xlabel => "Longer tics", xtics => { length => "5, 3", minor => 4, }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/plotStyle_12.pl0000755000377200037720000000151212122543116017622 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demo of the candle sticks plotting style # Initiate the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/plotStyle_12.png', ); # Raw data my @t = (0 .. 100); my (@op, @hi, @lo, @cl) = (); $op[0] = 100; # open price $hi[0] = $op[0] + rand()/5; # high price $lo[0] = $op[0] - rand()/5; # low price $cl[0] = ($op[0]+$hi[0]+$lo[0])/3; # close price foreach my $i (1 .. $#t) { $op[$i] = $cl[$i-1] + (rand()-0.5)/2; $hi[$i] = $op[$i] + rand()/5; $lo[$i] = $op[$i] - rand()/5; $cl[$i] = ($op[$i]+$hi[$i]+$lo[$i])/3; } # Plot the data my $timeSeries = Chart::Gnuplot::DataSet->new( xdata => \@t, ydata => [\@op, \@hi, \@lo, \@cl], style => 'candlesticks', ); # Plot the graph $chart->plot2d($timeSeries); Chart-Gnuplot-0.23/examples/axisTics_4.pl0000755000377200037720000000051112122543115017330 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisTics_4.png", xlabel => "Number format with 2 decimal places", xtics => { labelfmt => '%.2f', }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/legend_10.pl0000755000377200037720000000133412122543115017060 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demonstration of formatting legend # - composite example my $chart = Chart::Gnuplot->new( output => "gallery/legend_10.png", legend => { position => "outside center bottom", order => "horizontal reverse", align => 'left', border => 'on', }, ); # Lines my $lines = Chart::Gnuplot::DataSet->new( func => "cos(x)", title => "cosine", ); # Points my $points = Chart::Gnuplot::DataSet->new( func => "sin(x)", title => "sine", ); # Points on line my $linespoints = Chart::Gnuplot::DataSet->new( func => "x**2", title => "quadratic", ); # Plot the graph $chart->plot2d($lines, $points, $linespoints); Chart-Gnuplot-0.23/examples/plotStyle_7.pl0000755000377200037720000000101412122543115017542 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/plotStyle_7.png", ); # Filled curves my $filled_1 = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "filledcurve", ); my $filled_2 = Chart::Gnuplot::DataSet->new( func => "cos(x) - 2", style => "filledcurve x1", ); my $filled_3 = Chart::Gnuplot::DataSet->new( func => "cos(x) + 2", style => "filledcurve x2", ); # Plot the graph $chart->plot2d($filled_1, $filled_2, $filled_3); Chart-Gnuplot-0.23/examples/grid_9.pl0000755000377200037720000000101212122543115016470 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Create the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/grid_9.png', xtics => { minor => 4 }, ytics => { minor => 4 }, grid => { linetype => 'longdash, dot-longdash', color => 'light-blue', width => '3, 1', xlines => 'off, on', }, ); # Data set object my $data = Chart::Gnuplot::DataSet->new( func => 'sin(x)', ); # Plot the graph $chart->plot2d($data); Chart-Gnuplot-0.23/examples/plotStyle_13.pl0000755000377200037720000000104412122543115017622 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demonstration of the horizontal bar style # Initiate the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/plotStyle_13.png', title => 'horizontal bars' ); # Raw data # - Gaussian distribution my (@x, @y) = (); for (my $x = 0; $x < 5; $x += 0.1) { my $y = exp(-$x*$x/2); push(@x, $x); push(@y, $y); } # Data set object my $hbars = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, style => "hbars", ); # Plot the graph $chart->plot2d($hbars); Chart-Gnuplot-0.23/examples/multiplot_3.pl0000755000377200037720000000231212122543115017572 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $multiChart = Chart::Gnuplot->new( output => "gallery/multiplot_3.png", title => "Multiplot chart", ); #---------------------------------------- # Left chart my @charts = (); $charts[0][0] = Chart::Gnuplot->new( grid => "on", ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "(x*x+y*y) * exp(-0.05*(x*x+y*y))", ); $charts[0][0]->add3d($dataSet); #---------------------------------------- #---------------------------------------- # Central chart my @y = (5, 2.3, 6.78, 1, 0, 4.4, 7, 2.7, 5.4, 7.8, 9.5); $charts[0][1] = Chart::Gnuplot->new(); $dataSet = Chart::Gnuplot::DataSet->new( ydata => \@y, style => "boxes", ); $charts[0][1]->add2d($dataSet); #---------------------------------------- #---------------------------------------- # Right chart $charts[0][2] = Chart::Gnuplot->new( title => { text => "Right chart", color => "#99ccff", } ); $dataSet = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "linespoints", pointtype => "triangle", ); $charts[0][2]->add2d($dataSet); #---------------------------------------- # Plot the multplot chart $multiChart->multiplot(\@charts); Chart-Gnuplot-0.23/examples/axisLabel_3.pl0000755000377200037720000000046512122543115017454 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisLabel_3.png", ylabel => { text => "Rotated 80 deg", rotate => 80, }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/plot3d_3.pl0000755000377200037720000000042212122543115016746 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/plot3d_3.png", title => "3D plot from data file", ); my $dataSet = Chart::Gnuplot::DataSet->new( datafile => "plot3d_3.dat", ); $chart->plot3d($dataSet); Chart-Gnuplot-0.23/examples/legend_3.pl0000755000377200037720000000114612122543115017003 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demonstration of formatting legend # - add legend border my $chart = Chart::Gnuplot->new( output => "gallery/legend_3.png", legend => { border => 'on', }, ); # Lines my $lines = Chart::Gnuplot::DataSet->new( func => "cos(x)", title => "cosine", ); # Points my $points = Chart::Gnuplot::DataSet->new( func => "sin(x)", title => "sine", ); # Points on line my $linespoints = Chart::Gnuplot::DataSet->new( func => "x**2", title => "quadratic", ); # Plot the graph $chart->plot2d($lines, $points, $linespoints); Chart-Gnuplot-0.23/examples/chartFmt_1.pl0000755000377200037720000000043712122543115017315 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => 'gallery/chartFmt_1.png', title => 'My chart title', # chart title ); my $data = Chart::Gnuplot::DataSet->new( func => "tanh(x)", ); # Plot the graph $chart->plot2d($data); Chart-Gnuplot-0.23/examples/Makefile0000644000377200037720000000347012122543115016425 0ustar kwmakkwmakIMAGES = \ axisLabel_1.png \ axisLabel_2.png \ axisLabel_3.png \ axisLabel_4.png \ axisLabel_5.png \ axisLabel_6.png \ axisLabel_7.png \ axisLabel_8.png \ axisTics_1.png \ axisTics_2.png \ axisTics_3.png \ axisTics_4.png \ axisTics_5.png \ axisTics_6.png \ axisTics_7.png \ axisTics_8.png \ axisTics_9.png \ axisTics_10.png \ axisTics_11.png \ axisTics_12.png \ axisTics_13.png \ background_1.png \ background_2.png \ border_1.png \ border_2.png \ border_3.png \ chartDim_1.png \ chartDim_2.png \ chartDim_3.png \ chartFmt_1.png \ chartFmt_2.png \ chartFmt_3.png \ chartFmt_4.png \ chartTitle_1.png \ chartTitle_2.png \ chartTitle_3.png \ chartTitle_4.png \ chartTitle_5.png \ chartTitle_6.png \ chartTitle_7.png \ chartTitle_8.png \ dataSrc_1.png \ dataSrc_2.png \ dataSrc_3.png \ dataSrc_4.png \ dataSrc_5.png \ dataSrc_6.png \ datetime_1.png \ datetime_2.png \ datetime_3.png \ grid_1.png \ grid_2.png \ grid_3.png \ grid_4.png \ grid_5.png \ grid_6.png \ grid_7.png \ grid_8.png \ grid_9.png \ legend_1.png \ legend_2.png \ legend_3.png \ legend_4.png \ legend_5.png \ legend_6.png \ legend_7.png \ legend_8.png \ legend_9.png \ legend_10.png \ lineStyle_1.png \ lineStyle_2.png \ lineStyle_3.png \ lineStyle_4.png \ lineStyle_5.png \ multiplot_1.png \ multiplot_2.png \ multiplot_3.png \ plot3d_1.png \ plot3d_2.png \ plot3d_3.png \ plot3d_4.png \ plotAxes_1.png \ plotAxes_2.png \ plotStyle_1.png \ plotStyle_2.png \ plotStyle_3.png \ plotStyle_4.png \ plotStyle_5.png \ plotStyle_6.png \ plotStyle_7.png \ plotStyle_8.png \ plotStyle_9.png \ plotStyle_10.png \ plotStyle_11.png \ plotStyle_12.png \ plotStyle_13.png \ plotStyle_14.png \ plotStyle_15.png \ range_1.png \ range_2.png \ range_3.png \ all: mkdir $(IMAGES) mkdir: @mkdir -p gallery %.png: %.pl @echo "Plotting $@" @perl $< clean: @rm -f *~ @-cd gallery; rm -f $(IMAGES) Chart-Gnuplot-0.23/examples/axisTics_2.pl0000755000377200037720000000050612122543115017332 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisTics_2.png", xlabel => "Specify the tics to label", xtics => { labels => [1, 2, 5, 7, 8], }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/plotStyle_5.pl0000755000377200037720000000052612122543116017550 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/plotStyle_5.png", ); # Boxes my $boxes = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "boxes", fill => { density => 0.2, border => 'off', }, ); # Plot the graph $chart->plot2d($boxes); Chart-Gnuplot-0.23/examples/background_2.pl0000755000377200037720000000055712122543115017670 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/background_2.png", title => "Filling background color in the plot area", plotbg => { color => "#c9c9ff", density => 0.2, }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/axisTics_6.pl0000755000377200037720000000052612122543115017340 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisTics_6.png", xlabel => "Tic label in times-roman and font size 20", xtics => { font => "Times-Roman, 20", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/chartTitle_5.pl0000755000377200037720000000046212122543115017652 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/chartTitle_5.png", title => { text => "Pink title", color => "pink", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/chartTitle_1.pl0000755000377200037720000000042612122543115017646 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/chartTitle_1.png", title => "Default format of the chart title", ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/legend_6.pl0000755000377200037720000000125512122543115017007 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demonstration of formatting legend # - title of the legend my $chart = Chart::Gnuplot->new( output => "gallery/legend_6.png", title => 'Legend with title', legend => { title => 'Legend title', border => 'on', }, ); # Lines my $lines = Chart::Gnuplot::DataSet->new( func => "cos(x)", title => "cosine", ); # Points my $points = Chart::Gnuplot::DataSet->new( func => "sin(x)", title => "sine", ); # Points on line my $linespoints = Chart::Gnuplot::DataSet->new( func => "x**2", title => "quadratic", ); # Plot the graph $chart->plot2d($lines, $points, $linespoints); Chart-Gnuplot-0.23/examples/axisTics_5.pl0000755000377200037720000000050412122543115017333 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisTics_5.png", xlabel => "Tic labels in times-italic", xtics => { font => "Times-Italic", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/range_3.pl0000755000377200037720000000056112122543115016641 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/range_3.png", title => "A hypotrochoid", trange => [0, 40], ); # A hypotrochoid my $dataSet = Chart::Gnuplot::DataSet->new( func => { x => 'cos(t) + 5*cos(0.4*t)', y => 'sin(t) - 5*sin(0.4*t)', }, ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/chartDim_3.pl0000755000377200037720000000055512122543115017303 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/chartDim_3.png", title => "Margin", bmargin => 10, # bottom margin: 10 characters height rmargin => 20, # right margin: 20 characters width ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/README0000644000377200037720000000036412122543115015644 0ustar kwmakkwmakThese demo scripts are some examples to show how to do something with Chart::Gnuplot. To generate the results, you make type "make" if you have GNU make utility. Alternatively, you may execute them one by one. Then, you may browse index.html. Chart-Gnuplot-0.23/examples/chartFmt_3.pl0000755000377200037720000000042212122543115017311 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => 'gallery/chartFmt_3.png', ); my $data = Chart::Gnuplot::DataSet->new( func => "tanh(x)", title => 'legend', # legend ); # Plot the graph $chart->plot2d($data); Chart-Gnuplot-0.23/examples/plotStyle_8.pl0000755000377200037720000000251712122543115017554 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; #------------------------------------ # Demonstrate setting error bar styles #------------------------------------ # Initiate the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/plotStyle_8.png', title => 'Error bar styles', ); # - Data can be specified by xdata and ydata # - Data sets with x error bars my @x = (1, 2, 3, 4, 5, 6); my @y = (3, 2, 1, 0, -1, -2); my @err = (0.5, 0.4, 0.3, 0.1, 0.5, 0.2); my $xerrorbars = Chart::Gnuplot::DataSet->new( xdata => [[@x], [@err]], ydata => [@y], style => 'xerrorbars', title => 'xerrorbars', ); # - Data sets with y error bars @x = (1, 2, 3, 4, 5, 6); @y = (5, 4, 3, 2, 1, 0); @err = (0.5, 0.4, 0.1, 0, 0.3, 0.6); my $yerrorbars = Chart::Gnuplot::DataSet->new( xdata => [@x], ydata => [[@y], [@err]], style => 'yerrorbars', title => 'yerrorbars', ); # - Alternatively, data can be specified by points # - Data sets with both x and y error bars my @pairs = ( [1, 7, 0.1, 0.5], [2, 6, 0.3, 0.4], [3, 5, 0.3, 0.1], [4, 4, 0.4, 0.1], [5, 3, 0.1, 0.3], [6, 2, 0.6, 0.6], ); my $xyerrorbars = Chart::Gnuplot::DataSet->new( points => \@pairs, style => 'xyerrorbars', title => 'xyerrorbars', ); # Plot the graph $chart->plot2d($xerrorbars, $yerrorbars, $xyerrorbars); Chart-Gnuplot-0.23/examples/lineStyle_3.pl0000755000377200037720000000042612122543115017515 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/lineStyle_3.png", ); my $width = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "lines", width => 3, ); # Plot the graph $chart->plot2d($width); Chart-Gnuplot-0.23/examples/plotStyle_14.pl0000755000377200037720000000112212122543116017621 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demonstration of the horizontal line style # Initiate the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/plotStyle_14.png', title => 'horizontal lines', ); # Raw data # - Gaussian dis\tribution # - uniformly sampled in y-axis my (@x, @y) = (); for (my $y = 0.02; $y < 1; $y += 0.02) { my $x = sqrt(-2*log($y)); push(@x, $x); push(@y, $y); } # Data set object my $hlines = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, style => "hlines", ); # Plot the graph $chart->plot2d($hlines); Chart-Gnuplot-0.23/examples/plot3d_4.pl0000755000377200037720000000042612122543115016753 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/plot3d_4.png", title => "3D plot from function", ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "exp(-(x**2 + y**2)/5)", ); $chart->plot3d($dataSet); Chart-Gnuplot-0.23/examples/dataSrc_6.pl0000755000377200037720000000224712122543116017135 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; #--------------------------------------------------------- # Demonstrate four types of data input # - Data set can be input as Perl arrays, file or function #--------------------------------------------------------- # Initiate the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/dataSrc_6.png', title => 'Different ways to input data set', ); # Arrays of x-values and y-values my @x = (-10 .. 10); my @y = (0 .. 20); my $data1 = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, title => 'Arrays of x-values and y-values', ); # Data points my @points = ( [-7, 7], [-6, 6], [-5, 5], [-4, 4], [-3, 3], [-2, 4], [-1, 5], [0, 6], [1, 7], [2, 8], ); my $data2 = Chart::Gnuplot::DataSet->new( points => \@points, title => 'Array of x-y pairs', ); # Data file my $file = Chart::Gnuplot::DataSet->new( datafile => 'dataSrc_3.dat', title => 'Text file', ); # Function: sine function my $func = Chart::Gnuplot::DataSet->new( func => 'sin(x)', title => 'Math expression', ); # Plot the graph $chart->plot2d($data1, $data2, $file, $func); Chart-Gnuplot-0.23/examples/axisTics_1.pl0000755000377200037720000000051212122543115017326 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisTics_1.png", xlabel => "Three minor tics between every two major tics", xtics => { minor => 3 }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/axisLabel_6.pl0000755000377200037720000000047012122543115017453 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisLabel_6.png", ylabel => { text => "Blue axis label", color => "blue", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/plotStyle_9.pl0000755000377200037720000000123012122543115017544 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; #------------------------------------ # Demonstrate setting error line styles #------------------------------------ # Initiate the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/plotStyle_9.png', ); # - Data can be specified by xdata and ydata, or points # - Styles include xerrorlines, yerrorlines and xyerrorlines my @x = (1, 2, 3, 4, 5, 6); my @y = (-2, -1, 0, 1, 2, 3); my @err = (0.5, 0.4, 0.3, 0.1, 0.5, 0.2); my $xerrorlines = Chart::Gnuplot::DataSet->new( xdata => [\@x, \@err], ydata => \@y, style => 'xerrorlines', ); # Plot the graph $chart->plot2d($xerrorlines); Chart-Gnuplot-0.23/examples/border_1.pl0000755000377200037720000000047412122543115017023 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/border_1.png", title => "Line type of the graph border", border => { linetype => 3, }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/grid_1.pl0000755000377200037720000000043612122543115016471 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/grid_1.png", title => "Default format of grid lines", grid => 'on' ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/legend_7.pl0000755000377200037720000000124512122543116017010 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demonstration of formatting legend # - order of the sample lines my $chart = Chart::Gnuplot->new( output => "gallery/legend_7.png", title => 'Reverse order of the sample lines', legend => { order => 'reverse', }, ); # Lines my $lines = Chart::Gnuplot::DataSet->new( func => "cos(x)", title => "cosine", ); # Points my $points = Chart::Gnuplot::DataSet->new( func => "sin(x)", title => "sine", ); # Points on line my $linespoints = Chart::Gnuplot::DataSet->new( func => "x**2", title => "quadratic", ); # Plot the graph $chart->plot2d($lines, $points, $linespoints); Chart-Gnuplot-0.23/examples/grid_2.pl0000755000377200037720000000135112122543115016467 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # - Minor grid lines will be added if the minor axis tics are added # - Minor grid lines cannot be drawn if the minor axis tics are not added my $chart = Chart::Gnuplot->new( output => "gallery/grid_2.png", title => "Add minor grid lines", xlabel => "major and minor grid lines", ylabel => "only minor grid lines", xtics => { minor => 4, }, ytics => { minor => 2, }, grid => { xlines => 'on', # draw major grid lines ylines => 'off', # no major grid lines }, minorgrid => 'on', # draw minor grid lines ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/axisLabel_1.pl0000755000377200037720000000060112122543115017442 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisLabel_1.png", title => "Default format of the axis labels", xlabel => "x-label", ylabel => "y-label", x2label => "x2-label", y2label => "y2-label", ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/legend_5.pl0000755000377200037720000000122612122543115017004 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demonstration of formatting legend # - dimension of the legend my $chart = Chart::Gnuplot->new( output => "gallery/legend_5.png", legend => { width => 3, height => 4, border => 'on', }, ); # Lines my $lines = Chart::Gnuplot::DataSet->new( func => "cos(x)", title => "cosine", ); # Points my $points = Chart::Gnuplot::DataSet->new( func => "sin(x)", title => "sine", ); # Points on line my $linespoints = Chart::Gnuplot::DataSet->new( func => "x**2", title => "quadratic", ); # Plot the graph $chart->plot2d($lines, $points, $linespoints); Chart-Gnuplot-0.23/examples/plotAxes_2.pl0000755000377200037720000000114112122543115017336 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Initiate the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/plotAxes_2.png', xrange => [-1, 1], x2range => ['-pi', 'pi'], xtics => { mirror => 'off', }, ytics => { mirror => 'off', }, x2tics => 'on', y2tics => 'on', ); # Data sets my $cos = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "lines", ); my $sin = Chart::Gnuplot::DataSet->new( func => "sin(x)*2", style => "lines", axes => 'x2y2', ); # Plot the graph $chart->plot2d($cos, $sin); Chart-Gnuplot-0.23/examples/axisTics_11.pl0000755000377200037720000000047212122543115017414 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisTics_11.png", xlabel => "No tics on the x2-axis", xtics => { mirror => 'off', }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/legend_1.pl0000755000377200037720000000107212122543115016777 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demonstration of formatting legend # - show default setting my $chart = Chart::Gnuplot->new( output => "gallery/legend_1.png", ); # Lines my $lines = Chart::Gnuplot::DataSet->new( func => "cos(x)", title => "cosine", ); # Points my $points = Chart::Gnuplot::DataSet->new( func => "sin(x)", title => "sine", ); # Points on line my $linespoints = Chart::Gnuplot::DataSet->new( func => "x**2", title => "quadratic", ); # Plot the graph $chart->plot2d($lines, $points, $linespoints); Chart-Gnuplot-0.23/examples/axisTics_13.pl0000755000377200037720000000150312122543115017412 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Create the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/axisTics_13.png', xtics => { labelfmt => '%.1g', # label format font => 'arial,18', # font fontcolor => 'magenta', # text color }, ytics => { labels => [-0.8, 0.3, 0.6], # specify tic labels rotate => '30', # rotate the text in degree mirror => 'off', # no tic on y2 axis }, x2tics => [-8, -6, -2, 2, 5, 9], y2tics => { length => "4,2", # tic size minor => 4, # 2 minor tics between major tics }, ); # Data set object my $data = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); # Plot the graph $chart->plot2d($data); Chart-Gnuplot-0.23/examples/plotAxes_1.pl0000755000377200037720000000077712122543115017353 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Initiate the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/plotAxes_1.png', xrange => [-1, 1], x2range => ['-pi', 'pi'], x2tics => 'on', y2tics => 'on', ); # Data sets my $cos = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "lines", ); my $sin = Chart::Gnuplot::DataSet->new( func => "sin(x)*2", style => "lines", axes => 'x2y2', ); # Plot the graph $chart->plot2d($cos, $sin); Chart-Gnuplot-0.23/examples/range_2.pl0000755000377200037720000000061712122543115016642 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/range_2.png", xlabel => "Auto lower limit. User-specified upper limit", xrange => ["*", "pi"], ylabel => "User-specified lower limit. Auto upper limit", yrange => [0, "*"], ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/chartTitle_7.pl0000755000377200037720000000051112122543115017647 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/chartTitle_7.png", title => { text => "Greek {/Symbol-Oblique title}", enhanced => "on", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/lineStyle_5.pl0000755000377200037720000000044312122543115017516 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/lineStyle_5.png", ); my $width = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "points", pointsize => 3, ); # Plot the graph $chart->plot2d($width); Chart-Gnuplot-0.23/examples/legend_9.pl0000755000377200037720000000136212122543114017010 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Demonstration of formatting legend # - format the sample lines my $chart = Chart::Gnuplot->new( output => "gallery/legend_9.png", title => "Format the sample lines", legend => { sample => { length => 10, position => 'left', spacing => 2, } }, ); # Lines my $lines = Chart::Gnuplot::DataSet->new( func => "cos(x)", title => "cosine", ); # Points my $points = Chart::Gnuplot::DataSet->new( func => "sin(x)", title => "sine", ); # Points on line my $linespoints = Chart::Gnuplot::DataSet->new( func => "x**2", title => "quadratic", ); # Plot the graph $chart->plot2d($lines, $points, $linespoints); Chart-Gnuplot-0.23/examples/plot3d_1.pl0000755000377200037720000000076512133301164016754 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Data in Perl arrays my (@x, @y, @z) = (); for (my $x = -5; $x < 5; $x += 0.02) { my $y = sin($x*3); my $z = cos($x*3); push(@x, $x); push(@y, $y); push(@z, $z); } my $chart = Chart::Gnuplot->new( output => "gallery/plot3d_1.png", title => "3D plot from arrays of coordinates", ); my $dataSet = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, zdata => \@z, style => 'lines', ); $chart->plot3d($dataSet); Chart-Gnuplot-0.23/examples/datetime_3.pl0000755000377200037720000000145212122543115017341 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Change the date time format of the tic labels # - the solution is the same as change the number format # Date array my @x = qw( 2007-01-01 2007-01-10 2007-01-24 2007-02-01 2007-02-14 2007-02-28 2007-03-05 2007-03-13 2007-03-21 2007-03-31 ); my @y = (1 .. 10); # Create the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/datetime_3.png', xtics => { labelfmt => '%b-%y' }, timeaxis => "x", # declare that x-axis uses time format ); # Data set object my $data = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, style => 'linespoints', timefmt => '%Y-%m-%d', # input time format ); # Plot the graph $chart->plot2d($data); Chart-Gnuplot-0.23/examples/grid_7.pl0000755000377200037720000000052512122543116016477 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/grid_7.png", xtics => { minor => 3, }, grid => { width => "3, 1", xlines => "on, on", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/multiplot_2.pl0000755000377200037720000000172412122543115017577 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; #---------------------------------------- # Demonstration of generating inset chart #---------------------------------------- my $multiChart = Chart::Gnuplot->new( output => "gallery/multiplot_2.png", ); #---------------------------------------- # Large chart my $large = Chart::Gnuplot->new( title => "Inset chart", ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "norm(x)", ); $large->add2d($dataSet); #---------------------------------------- #---------------------------------------- # Small chart my $small = Chart::Gnuplot->new( title => 'a small chart', origin => '0.1, 0.5', size => '0.4, 0.4', ); $dataSet = Chart::Gnuplot::DataSet->new( func => "cos(x)", ); $small->add2d($dataSet); #---------------------------------------- #---------------------------------------- # Plot the multplot chart $multiChart->multiplot($large, $small); #---------------------------------------- Chart-Gnuplot-0.23/examples/list.html0000644000377200037720000000265712122543115016634 0ustar kwmakkwmak

Goto:

Data source
Basic chart formatting
2D plotting styles
Line and point styles
Range of the plot
Formatting the chart title
Formatting the axis label
Formatting the axis tics
Formatting the grid lines
Formatting the legend
Formatting the graph borders
Date and time data
Plot on the secondary axes
Chart dimension
Background color
3D plots
Multiplot
Chart-Gnuplot-0.23/examples/chartTitle_6.pl0000755000377200037720000000051312122543115017650 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/chartTitle_6.png", title => { text => "Super^{script} and sub_{script}", enhanced => "on", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/lineStyle_4.pl0000755000377200037720000000045512122543115017520 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/lineStyle_4.png", ); my $type = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "points", pointtype => "fill-circle", ); # Plot the graph $chart->plot2d($type); Chart-Gnuplot-0.23/examples/lineStyle_1.pl0000755000377200037720000000057112122543115017514 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/lineStyle_1.png", ); # The color of line and points are changed together my $color = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "linespoints", color => "violet", # can be color name or RGB value ); # Plot the graph $chart->plot2d($color); Chart-Gnuplot-0.23/examples/plot3d_2.pl0000755000377200037720000000065312133301321016744 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Input data source my @points = (); for (my $x = -5; $x < 5; $x += 0.02) { my $y = sin($x*3); my $z = cos($x*3); push(@points, [$x, $y, $z]); } my $chart = Chart::Gnuplot->new( output => "gallery/plot3d_2.png", title => "3D plot from Perl array of points", ); my $dataSet = Chart::Gnuplot::DataSet->new( points => \@points, ); $chart->plot3d($dataSet); Chart-Gnuplot-0.23/examples/chartDim_2.pl0000755000377200037720000000050212122543115017272 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/chartDim_2.png", title => "20% shorter in length, 50% shorter in height", imagesize => "0.8, 0.5", ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/main.html0000644000377200037720000005165512122543115016607 0ustar kwmakkwmak Demo codes for Chart::Gnuplot

Demo codes for Chart::Gnuplot

Data source

Perl arrays of x coordinates and y coordinates script sample image
Perl array of x-y pairs script sample image
Data file (space delimited) script sample image
Mathematical function script sample image
Parametric function script sample image
Mixed data source script sample image

Basic chart formatting

Add a chart title script sample image
Add axis labels script sample image
Add legend script sample image
Add grid lines script sample image

2D plotting styles

Lines, points and points on lines script sample image
Dots script sample image
Impulses script sample image
Boxes script sample image
Fill the boxes script sample image
Join with steps, fsteps and histeps script sample image
Filled the curves script sample image
Error bar styles script sample image
Error line styles script sample image
Styles of combination of boxes and error bars script sample image
Finance bar style script sample image
Candle stick style script sample image
Horizontal bar style script sample image
Horizontal line style script sample image
Smooth the line segments joining data points script sample image

Line and point styles

Line and point color script sample image
Line type script sample image
Line width script sample image
Point type script sample image
Point size script sample image

Range of the plot

User-specified range of the plot script sample image
Semi-autoscale script sample image
Range of parametric parameter script sample image

Formatting the chart title

Use default settings script sample image
Location script sample image
Font script sample image
Font and font size script sample image
Font color script sample image
Superscript and subscript script sample image
Greek letters script sample image
Composite example script sample image

Formatting the axis label

Use default settings script sample image
Location script sample image
Rotated text script sample image
Font script sample image
Font and font size script sample image
Font color script sample image
Superscript and subscript script sample image
Greek letters script sample image

Formatting the axis tics

Number of minor tics between consecutive major tics script sample image
Specify the tics to label script sample image
Re-label the tics script sample image
Tic label number format script sample image
Tic label font script sample image
Tic label font and font size script sample image
Tic label color script sample image
Location of the tic label script sample image
Rotate the tic label script sample image
Tic length script sample image
Remove the tics on the opposite axis script sample image
Turn on and off the tics script sample image
Composite example script sample image

Formatting the grid lines

Use default settings script sample image
Add minor grid lines script sample image
Line type script sample image
Line width script sample image
Color script sample image
Use another line type for minor grid script sample image
Use another line width for minor grid script sample image
Use another line color for minor grid script sample image
Composite example script sample image

Formatting the legend

Use default settings script sample image
Position script sample image
Add border script sample image
Format the border script sample image
Dimension script sample image
Legend title script sample image
Order of the sample lines script sample image
Alignment of the label script sample image
Format the sample lines script sample image
Composite example script sample image

Formatting the graph borders

Line type script sample image
Line width script sample image
Color script sample image

Date and time data

Date data script sample image
Time data script sample image
Change the date time format of the tic labels script sample image

Plot on the secondary axes

Simple example script sample image
Composite example script sample image

Chart dimension

Orientation script sample image
Image size script sample image
Margin script sample image

Background color

Background color of the chart script sample image
Background color of the plot area script sample image

3D plots

Plot from Perl arrays of x, y and z coordinates script sample image
Plot from Perl array of points script sample image
Plot from data file (space delimited) script sample image
Plot from function script sample image

Multiplot

Use array to define image layout script sample image
Inset graph script sample image
Composite example script sample image
Chart-Gnuplot-0.23/examples/plotStyle_10.pl0000755000377200037720000000173412122543115017625 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; #----------------------------------------------------------- # Demonstrate of styles of combination of box and error bars #----------------------------------------------------------- # Initiate the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/plotStyle_10.png', title => 'Box error bar styles', ); # Style of combination of boxes and y error bars my @x = (1, 2, 3, 4, 5, 6); my @y = (0, 1, 2, 3, 4, 5); my @xerr = (0.5, 0.4, 0.1, 0, 0.3, 0.6); my $boxerrorbars = Chart::Gnuplot::DataSet->new( xdata => [@x], ydata => [[@y], [@xerr]], style => 'boxerrorbars', ); # Style of combination of boxes and x-y error bars @y = (2, 3, 4, 5, 6, 7); my @yerr = (0.5, 0.4, 0.2, 0.2, 0.4, 0.7); my $boxxyerrorbars = Chart::Gnuplot::DataSet->new( xdata => [[@x], [@xerr]], ydata => [[@y], [@yerr]], style => 'boxxyerrorbars', ); # Plot the graph $chart->plot2d($boxerrorbars, $boxxyerrorbars); Chart-Gnuplot-0.23/examples/plotStyle_15.pl0000755000377200037720000000136112122543115017626 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Initiate the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/plotStyle_15.png', ); # Raw data my @x = (1, 2, 3, 4, 5, 6); my @y = (2, 8, 3, 2, 4, 0); my $points = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, style => 'linespoints', ); my $csplines = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, style => 'lines', smooth => 'csplines', title => 'Smoothed by cubic splines', ); my $bezier = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, style => 'lines', smooth => 'bezier', title => 'Smoothed by a Bezier curve', ); # Plot the graph $chart->plot2d($points, $csplines, $bezier); Chart-Gnuplot-0.23/examples/dataSrc_3.pl0000755000377200037720000000041312122543115017122 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Chart object my $chart = Chart::Gnuplot->new( output => "gallery/dataSrc_3.png", ); # Data set object my $dataSet = Chart::Gnuplot::DataSet->new( datafile => "dataSrc_3.dat" ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/plotStyle_4.pl0000755000377200037720000000041612122543115017544 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/plotStyle_4.png", ); # Boxes my $boxes = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "boxes", ); # Plot the graph $chart->plot2d($boxes); Chart-Gnuplot-0.23/examples/index.html0000644000377200037720000000023512122543116016757 0ustar kwmakkwmak Demo codes for Chart::Gnuplot Chart-Gnuplot-0.23/examples/plot3d_3.dat0000644000377200037720000000014112122543115017076 0ustar kwmakkwmak# Plain text data file 1 1 1.5 1 2 1.8 1 3 1.5 2 1 1.8 2 2 2.0 2 3 1.8 3 1 1.5 3 2 1.8 3 3 1.5 Chart-Gnuplot-0.23/examples/axisTics_8.pl0000755000377200037720000000046512122543115017344 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisTics_8.png", xlabel => "Shifted tic label", xtics => { offset => "8, -1" }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/plotStyle_2.pl0000755000377200037720000000127212122543114017542 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Plot 2D Gaussian distribution in dots # Construct data points to plot my $pi = 3.14159; my @pairs = (); # Box-Muller transformation for (my $i = 0; $i < 10000; $i++) { my $rand_1 = rand(); my $rand_2 = rand(); my $common_1 = sqrt(-2*log($rand_1)); my $common_2 = 2*$pi*$rand_2; my $x = $common_1 * cos($common_2); my $y = $common_1 * sin($common_2); push(@pairs, [$x, $y]); } # Chart object my $chart = Chart::Gnuplot->new( output => "gallery/plotStyle_2.png", ); # Plot in dots my $dot = Chart::Gnuplot::DataSet->new( points => \@pairs, style => "dots", ); # Plot the graph $chart->plot2d($dot); Chart-Gnuplot-0.23/examples/axisTics_3.pl0000755000377200037720000000051712122543115017335 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisTics_3.png", xlabel => "Re-label the tics", xtics => { labels => ['"pi" 3.1416', '"-pi" -3.1416'], }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/chartFmt_2.pl0000755000377200037720000000045112122543115017312 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => 'gallery/chartFmt_2.png', xlabel => "x-axis label", ylabel => "y-axis label", ); my $data = Chart::Gnuplot::DataSet->new( func => "tanh(x)", ); # Plot the graph $chart->plot2d($data); Chart-Gnuplot-0.23/examples/grid_8.pl0000755000377200037720000000057012122543115016477 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/grid_8.png", xtics => { minor => 3, }, grid => { width => '1, 5', color => 'blue, #228b22', xlines => 'on, on', }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/axisLabel_7.pl0000755000377200037720000000052712122543115017457 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisLabel_7.png", xlabel => { text => "Label with super^{script} and sub_{script}", enhanced => 'on', }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/axisLabel_5.pl0000755000377200037720000000047712122543115017461 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisLabel_5.png", ylabel => { text => "Arial 20 axis label", font => "arial, 20", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/dataSrc_4.pl0000755000377200037720000000040012122543115017117 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Chart object my $chart = Chart::Gnuplot->new( output => "gallery/dataSrc_4.png", ); # Data set object my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)" ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/chartDim_1.pl0000755000377200037720000000043212122543115017273 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/chartDim_1.png", title => "Portrait plot", orient => "portrait", ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/axisTics_9.pl0000755000377200037720000000047512122543115017346 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/axisTics_9.png", ylabel => "Rotated tic label by 45 deg", ytics => { rotate => '45', }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/chartTitle_8.pl0000755000377200037720000000115212122543115017652 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; #----------------------------------------------- # Demonstrate setting sophisticated chart title #----------------------------------------------- # Initiate the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/chartTitle_8.png', title => { text => "My so^{phis}ticate_d title", font => "arial, 20", color => "#99ccff", offset => "-10, 2", enhanced => 'on', }, ); # Data sets my $cos = Chart::Gnuplot::DataSet->new( func => "cos(x)", ); # Plot the graph $chart->plot2d($cos); Chart-Gnuplot-0.23/examples/chartTitle_4.pl0000755000377200037720000000051612122543115017651 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/chartTitle_4.png", title => { text => "User specified font and font size", font => "Courier, 20", }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/lineStyle_2.pl0000755000377200037720000000044312122543116017514 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/lineStyle_2.png", ); my $type = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "lines", linetype => "2dash", ); # Plot the graph $chart->plot2d($type); Chart-Gnuplot-0.23/examples/chartFmt_4.pl0000755000377200037720000000044112122543115017313 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => 'gallery/chartFmt_4.png', title => "Add grid lines", grid => "on", ); my $data = Chart::Gnuplot::DataSet->new( func => "tanh(x)", ); # Plot the graph $chart->plot2d($data); Chart-Gnuplot-0.23/examples/datetime_2.pl0000755000377200037720000000122412122543116017336 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Time array my @x = qw( 00:00:00 03:05:24 06:15:58 10:03:20 10:57:00 11:42:32 13:30:03 15:00:30 17:23:27 19:38:41 ); my @y = (1 .. 10); # Create the chart object my $chart = Chart::Gnuplot->new( output => 'gallery/datetime_2.png', xlabel => 'Time axis', timeaxis => "x", # declare that x-axis uses time format ); # Data set object my $data = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, style => 'linespoints', timefmt => '%H:%M:%S', # input time format ); # Plot the graph $chart->plot2d($data); Chart-Gnuplot-0.23/examples/plotStyle_3.pl0000755000377200037720000000043212122543115017541 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/plotStyle_3.png", ); # Impulses my $impulses = Chart::Gnuplot::DataSet->new( func => "cos(x)", style => "impulses", ); # Plot the graph $chart->plot2d($impulses); Chart-Gnuplot-0.23/examples/dataSrc_2.pl0000755000377200037720000000063512122543115017127 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; # Input data source my @xy = ( [-2, 5], [-1, 3], [1, 2], [3, 1], [5, 0], [6, 1], [7, 2], [9, 3], [10, 4], [11, 5], ); # Chart object my $chart = Chart::Gnuplot->new( output => "gallery/dataSrc_2.png", ); # Data set object my $dataSet = Chart::Gnuplot::DataSet->new( points => \@xy ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/examples/grid_6.pl0000755000377200037720000000066112122543115016476 0ustar kwmakkwmak#!/usr/bin/perl -w use strict; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "gallery/grid_6.png", xtics => { minor => 3, }, grid => { linetype => "longdash", xlines => "on" }, minorgrid => { linetype => "dot-longdash", xlines => "on" }, ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $chart->plot2d($dataSet); Chart-Gnuplot-0.23/doc/0000755000377200037720000000000012471026131013711 5ustar kwmakkwmakChart-Gnuplot-0.23/doc/linetypes.txt0000644000377200037720000000017512122543114016467 0ustar kwmakkwmak List of known line type names: solid longdash dash dot dot-longdash dot-dash 2dash 2dot-dash 4dash Chart-Gnuplot-0.23/doc/pointtypes.txt0000644000377200037720000000053412122543114016670 0ustar kwmakkwmak List of known point type names: dot plus cross star dot-square dot-circle dot-triangle dot-diamond dot-pentagon fill-square fill-circle fill-triangle fill-diamond fill-pentagon square circle triangle diamond pentagon opaque-square opaque-circle opaque-triangle opaque-diamond opaque-pentagon Chart-Gnuplot-0.23/doc/colors.txt0000644000377200037720000000707412122543114015761 0ustar kwmakkwmak This file is generated by Gnuplot 4.2 List of known color names: white #ffffff = 255 255 255 black #000000 = 0 0 0 gray0 #000000 = 0 0 0 grey0 #000000 = 0 0 0 gray10 #1a1a1a = 26 26 26 grey10 #1a1a1a = 26 26 26 gray20 #333333 = 51 51 51 grey20 #333333 = 51 51 51 gray30 #4d4d4d = 77 77 77 grey30 #4d4d4d = 77 77 77 gray40 #666666 = 102 102 102 grey40 #666666 = 102 102 102 gray50 #7f7f7f = 127 127 127 grey50 #7f7f7f = 127 127 127 gray60 #999999 = 153 153 153 grey60 #999999 = 153 153 153 gray70 #b3b3b3 = 179 179 179 grey70 #b3b3b3 = 179 179 179 gray80 #cccccc = 204 204 204 grey80 #cccccc = 204 204 204 gray90 #e5e5e5 = 229 229 229 grey90 #e5e5e5 = 229 229 229 gray100 #ffffff = 255 255 255 grey100 #ffffff = 255 255 255 gray #bebebe = 190 190 190 grey #bebebe = 190 190 190 light-gray #d3d3d3 = 211 211 211 light-grey #d3d3d3 = 211 211 211 dark-gray #a9a9a9 = 169 169 169 dark-grey #a9a9a9 = 169 169 169 red #ff0000 = 255 0 0 light-red #f03232 = 240 50 50 dark-red #8b0000 = 139 0 0 yellow #ffff00 = 255 255 0 light-yellow #ffffe0 = 255 255 224 dark-yellow #c8c800 = 200 200 0 green #00ff00 = 0 255 0 light-green #90ee90 = 144 238 144 dark-green #006400 = 0 100 0 spring-green #00ff7f = 0 255 127 forest-green #228b22 = 34 139 34 sea-green #2e8b57 = 46 139 87 blue #0000ff = 0 0 255 light-blue #add8e6 = 173 216 230 dark-blue #00008b = 0 0 139 midnight-blue #191970 = 25 25 112 navy #000080 = 0 0 128 medium-blue #0000cd = 0 0 205 royalblue #4169e1 = 65 105 225 skyblue #87ceeb = 135 206 235 cyan #00ffff = 0 255 255 light-cyan #e0ffff = 224 255 255 dark-cyan #008b8b = 0 139 139 magenta #ff00ff = 255 0 255 light-magenta #f055f0 = 240 85 240 dark-magenta #8b008b = 139 0 139 turquoise #40e0d0 = 64 224 208 light-turquoise #afeeee = 175 238 238 dark-turquoise #00ced1 = 0 206 209 pink #ffc0cb = 255 192 203 light-pink #ffb6c1 = 255 182 193 dark-pink #ff1493 = 255 20 147 coral #ff7f50 = 255 127 80 light-coral #f08080 = 240 128 128 orange-red #ff4500 = 255 69 0 salmon #fa8072 = 250 128 114 light-salmon #ffa07a = 255 160 122 dark-salmon #e9967a = 233 150 122 aquamarine #7fffd4 = 127 255 212 khaki #f0e68c = 240 230 140 dark-khaki #bdb76b = 189 183 107 goldenrod #daa520 = 218 165 32 light-goldenrod #eedd82 = 238 221 130 dark-goldenrod #b8860b = 184 134 11 gold #ffd700 = 255 215 0 beige #f5f5dc = 245 245 220 brown #a52a2a = 165 42 42 orange #ffa500 = 255 165 0 dark-orange #ff8c00 = 255 140 0 violet #ee82ee = 238 130 238 dark-violet #9400d3 = 148 0 211 plum #dda0dd = 221 160 221 purple #a020f0 = 160 32 240 Chart-Gnuplot-0.23/lib/0000755000377200037720000000000012471026131013712 5ustar kwmakkwmakChart-Gnuplot-0.23/lib/Chart/0000755000377200037720000000000012471026131014753 5ustar kwmakkwmakChart-Gnuplot-0.23/lib/Chart/Gnuplot.pm0000644000377200037720000032145512471025255016761 0ustar kwmakkwmakpackage Chart::Gnuplot; use strict; use vars qw($VERSION); use Carp; use File::Copy qw(move); use File::Temp qw(tempdir); use Chart::Gnuplot::Util qw(_lineType _pointType _borderCode _fillStyle _copy); $VERSION = '0.23'; # Constructor sub new { my ($class, %hash) = @_; # Create temporary file to store Gnuplot instructions if (!defined $hash{_multiplot}) # if not in multiplot mode { my $dirTmp = tempdir(CLEANUP => 1); ($^O =~ /MSWin/)? ($dirTmp .= '\\'): ($dirTmp .= '/'); $hash{_script} = $dirTmp . "plot"; } # Default terminal: postscript terminal with color drawing elements if (!defined $hash{terminal} && !defined $hash{term}) { $hash{terminal} = "postscript enhanced color"; $hash{_terminal} = 'auto'; } # Default setting if (defined $hash{output}) { my @a = split(/\./, $hash{output}); my $ext = $a[-1]; $hash{terminal} .= " eps" if ($hash{terminal} =~ /^post/ && $ext eq 'eps'); } my $self = \%hash; return bless($self, $class); } # Generic attribute methods sub AUTOLOAD { my ($self, $key) = @_; my $attr = our $AUTOLOAD; $attr =~ s/.*:://; return if ($attr eq 'DESTROY'); # ignore destructor $self->{$attr} = $key if (defined $key); return($self->{$attr}); } # General set method sub set { my ($self, %opts) = @_; foreach my $opt (keys %opts) { ($opts{$opt} eq 'on')? $self->$opt('') : $self->$opt($opts{$opt}); } return($self); } # Add a 2D data set to the chart object # - used with multiplot sub add2d { my ($self, @dataSet) = @_; push(@{$self->{_dataSets2D}}, @dataSet); } # Add a 3D data set to the chart object # - used with multiplot sub add3d { my ($self, @dataSet) = @_; push(@{$self->{_dataSets3D}}, @dataSet); } # Add a 2D data set to the chart object # - redirect to &add2d # - for backward compatibility sub add {&add2d(@_);} # Plot 2D graphs # - call _setChart() # # TODO: # - Consider using pipe instead of system call # - support MS time format: %{yyyy}-%{mmm}-%{dd} %{HH}:%{MM} sub plot2d { my ($self, @dataSet) = @_; &_setChart($self, \@dataSet); my $plotString = join(', ', map {$_->_thaw($self)} @dataSet); open(GPH, ">>$self->{_script}") || confess("Can't write $self->{_script}"); print GPH "\nplot $plotString\n"; close(GPH); # Generate image file &execute($self); return($self); } # Plot 3D graphs # - call _setChart() # # TODO: # - Consider using pipe instead of system call # - support MS time format: %{yyyy}-%{mmm}-%{dd} %{HH}:%{MM} sub plot3d { my ($self, @dataSet) = @_; &_setChart($self, \@dataSet); my $plotString = join(', ', map {$_->_thaw($self)} @dataSet); open(GPH, ">>$self->{_script}") || confess("Can't write $self->{_script}"); print GPH "\nsplot $plotString\n"; close(GPH); # Generate image file &execute($self); return($self); } # Plot multiple plots in one single chart sub multiplot { my ($self, @charts) = @_; &_setChart($self); &_reset($self); open(PLT, ">>$self->{_script}") || confess("Can't write $self->{_script}"); # Emulate the title when there is background color fill if (defined $self->{title} && defined $self->{bg}) { print PLT "set label \"$self->{title}\" at screen 0.5, screen 1 ". "center offset 0,-1\n"; } if (scalar(@charts) == 1 && ref($charts[0]) eq 'ARRAY') { my $nrows = scalar(@{$charts[0]}); my $ncols = scalar(@{$charts[0][0]}); &_setMultiplot($self, $nrows, $ncols); for (my $r = 0; $r < $nrows; $r++) { for (my $c = 0; $c < $ncols; $c++) { my $chart = $charts[0][$r][$c]; $chart->_script($self->{_script}); $chart->_multiplot(1); delete $chart->{bg}; my $plot; my @dataSet; if (defined $chart->{_dataSets2D}) { $plot = 'plot'; @dataSet = @{$chart->{_dataSets2D}}; } elsif (defined $chart->{_dataSets3D}) { $plot = 'splot'; @dataSet = @{$chart->{_dataSets3D}}; } &_setChart($chart, \@dataSet); open(PLT, ">>$self->{_script}") || confess("Can't write $self->{_script}"); print PLT "\n$plot "; print PLT join(', ', map {$_->_thaw($self)} @dataSet), "\n"; close(PLT); &_reset($chart); } } } else { # Start multi-plot &_setMultiplot($self); foreach my $chart (@charts) { $chart->_script($self->{_script}); $chart->_multiplot(1); delete $chart->{bg}; my $plot; my @dataSet; if (defined $chart->{_dataSets2D}) { $plot = 'plot'; @dataSet = @{$chart->{_dataSets2D}}; } elsif (defined $chart->{_dataSets3D}) { $plot = 'splot'; @dataSet = @{$chart->{_dataSets3D}}; } &_setChart($chart, \@dataSet); open(PLT, ">>$self->{_script}") || confess("Can't write $self->{_script}"); print PLT "\n$plot "; print PLT join(', ', map {$_->_thaw($self)} @dataSet), "\n"; close(PLT); &_reset($chart); } } close(PLT); # Generate image file &execute($self); return($self); } # Pass generic commands sub command { my ($self, $cmd) = @_; open(PLT, ">>$self->{_script}") || confess("Can't write $self->{_script}"); (ref($cmd) eq 'ARRAY')? (print PLT join("\n", @$cmd), "\n"): (print PLT "$cmd\n"); close(PLT); return($self); } # Set how the chart looks like # - call _setTitle(), _setAxisLabel(), _setTics(), _setGrid(), _setBorder(), # _setTimestamp() # - called by plot2d() and plot3d() sub _setChart { my ($self, $dataSets) = @_; my @sets = (); # Orientation $self->{terminal} .= " $self->{orient}" if (defined $self->{orient}); # Set canvas size if (defined $self->{imagesize}) { my ($ws, $hs) = split(/,\s?/, $self->{imagesize}); if (defined $self->{_terminal} && $self->{_terminal} eq 'auto') { # for post terminal if (defined $self->{orient} && $self->{orient} eq 'portrait') { $ws *= 7 if ($ws =~ /^([1-9]\d*)?0?(\.\d+)?$/); $hs *= 10 if ($hs =~ /^([1-9]\d*)?0?(\.\d+)?$/); } else { $ws *= 10 if ($ws =~ /^([1-9]\d*)?0?(\.\d+)?$/); $hs *= 7 if ($hs =~ /^([1-9]\d*)?0?(\.\d+)?$/); } } $self->{terminal} .= " size $ws,$hs"; } # Prevent changing terminal in multiplot mode delete $self->{terminal} if (defined $self->{_multiplot}); # Start writing gnuplot script my $pltTmp = $self->{_script}; open(PLT, ">>$pltTmp") || confess("Can't write gnuplot script $pltTmp"); # Set character encoding # # Quote from Gnuplot manual: # "Generally you must set the encoding before setting the terminal type." if (defined $self->{encoding}) { print PLT "set encoding $self->{encoding}\n"; } # Chart background color if (defined $self->{bg}) { my $bg = $self->{bg}; if (ref($bg) eq 'HASH') { print PLT "set object rect from screen 0, screen 0 to ". "screen 1, screen 1 fillcolor rgb \"$$bg{color}\""; print PLT " fillstyle solid $$bg{density}" if (defined $$bg{density}); print PLT " behind\n"; } else { print PLT "set object rect from screen 0, screen 0 to ". "screen 1, screen 1 fillcolor rgb \"$bg\" behind\n"; } push(@sets, 'object'); } # Plot area background color if (defined $self->{plotbg}) { my $bg = $self->{plotbg}; if (ref($bg) eq 'HASH') { print PLT "set object rect from graph 0, graph 0 to ". "graph 1, graph 1 fillcolor rgb \"$$bg{color}\""; print PLT " fillstyle solid $$bg{density}" if (defined $$bg{density}); print PLT " behind\n"; } else { print PLT "set object rect from graph 0, graph 0 to ". "graph 1, graph 1 fillcolor rgb \"$bg\" behind\n"; } push(@sets, 'object'); } # Set date/time data # # For xrange to work for time-sequence, time-axis ("set xdata time") # and timeformat ("set timefmt '%Y-%m-%d'") MUST be set BEFORE # the range command ("set xrange ['2009-01-01','2009-01-07']") # # Thanks to Holyspell if (defined $self->{timeaxis}) { my @axis = split(/,\s?/, $self->{timeaxis}); foreach my $axis (@axis) { print PLT "set $axis"."data time\n"; push(@sets, $axis."data"); } foreach my $ds (@$dataSets) { if (defined $ds->{timefmt}) { print PLT "set timefmt \"$ds->{timefmt}\"\n"; last; } } } # Parametric plot foreach my $ds (@$dataSets) { # Determine if there is paramatric plot if (defined $ds->{func} && ref($ds->{func}) eq 'HASH') { $self->{parametric} = ''; last; } } my $setGrid = 0; # detect whether _setGrid has been run # Loop and process other chart options foreach my $attr (keys %$self) { if ($attr eq 'output') { print PLT "set output \"$self->{output}\"\n"; } elsif ($attr eq 'title') { print PLT "set title ".&_setTitle($self->{title})."\n"; push(@sets, 'title') } elsif ($attr =~ /^((x|y)2?|z)label$/) { print PLT "set $attr ".&_setAxisLabel($self->{$attr})."\n"; push(@sets, $attr); } elsif ($attr =~ /^((x|y)2?|z|t|u|v)range$/) { if (ref($self->{$attr}) eq 'ARRAY') { # Deal with ranges from array reference if (defined $self->{timeaxis} && $self->{timeaxis} =~ /(^|,)\s*$1\s*(,|$)/) { # $1-axis is a time axis print PLT "set $attr ['".join("':'", @{$self->{$attr}}). "']\n"; } else { print PLT "set $attr [".join(":", @{$self->{$attr}})."]\n"; } } elsif ($self->{$attr} eq 'reverse') { print PLT "set $attr [*:*] reverse\n"; } else { print PLT "set $attr $self->{$attr}\n"; } push(@sets, $attr); } elsif ($attr =~ /^(x|y|x2|y2|z)tics$/) { if (defined $self->{$attr}) { my ($axis) = ($attr =~ /^(.+)tics$/); print PLT "set $attr".&_setTics($self->{$attr})."\n"; if (ref($self->{$attr}) eq 'HASH') { if (defined ${$self->{$attr}}{labelfmt}) { print PLT "set format $axis ". "\"${$self->{$attr}}{labelfmt}\"\n"; push(@sets, 'format'); } if (defined ${$self->{$attr}}{minor}) { my $nTics = ${$self->{$attr}}{minor}+1; print PLT "set m$axis"."tics $nTics\n"; push(@sets, "m$axis"."tics"); } } push(@sets, $attr); } else { print PLT "unset $attr\n"; } } elsif ($attr eq 'legend') { print PLT "set key".&_setLegend($self->{legend})."\n"; push(@sets, 'key'); } elsif ($attr eq 'border') { if (defined $self->{border}) { print PLT "set border"; print PLT " ".&_borderCode($self->{border}->{sides}) if (defined $self->{border}->{sides}); print PLT &_setBorder($self->{border})."\n"; push(@sets, 'border'); } else { print PLT "unset border\n"; } } elsif ($attr =~ /^(minor)?grid$/) { next if ($setGrid == 1); print PLT "set grid".&_setGrid($self)."\n"; push(@sets, 'grid'); $setGrid = 1; } elsif ($attr eq 'timestamp') { print PLT "set timestamp".&_setTimestamp($self->{timestamp})."\n"; push(@sets, 'timestamp'); } elsif ($attr eq 'terminal') { print PLT "set $attr $self->{$attr}\n"; } # Non-gnuplot options / options specially treated before elsif (!grep(/^$attr$/, qw( gnuplot convert encoding imagesize orient bg plotbg timeaxis )) && $attr !~ /^_/) { (defined $self->{$attr} && $self->{$attr} ne '')? (print PLT "set $attr $self->{$attr}\n"): (print PLT "set $attr\n"); push(@sets, $attr); } } # Write labels my $isLabelSet = 0; foreach my $label (@{$self->{_labels}}) { print PLT "set label"."$label\n"; push(@sets, "label") if ($isLabelSet == 0); $isLabelSet = 1; } # Draw arrows my $isArrowSet = 0; foreach my $arrow (@{$self->{_arrows}}) { print PLT "set arrow"."$arrow\n"; push(@sets, "arrow") if ($isArrowSet == 0); $isArrowSet = 1; } # Draw objects my $isObjectSet = 0; foreach my $object (@{$self->{_objects}}) { print PLT "set object"."$object\n"; push(@sets, "object") if ($isObjectSet == 0); $isObjectSet = 1; } close(PLT); $self->_sets(\@sets); } # Set the details of the title # - called by _setChart() # # Usage example: # title => { # text => "My title", # font => "arial, 14", # color => "brown", # offset => "0, -1", # }, sub _setTitle { my ($title) = @_; if (ref($title)) { my $out = "\"$$title{text}\""; $out .= " offset $$title{offset}" if (defined $$title{offset}); # Font and size my $font; $font = $$title{font} if (defined $$title{font}); $font .= ",$$title{fontsize}" if (defined $$title{fontsize}); $out .= " font \"$font\"" if (defined $font); # Color $out .= " textcolor rgb \"$$title{color}\"" if (defined $$title{color}); # Switch of the enhanced mode. Default: off $out .= " noenhanced" if (!defined $$title{enhanced} || $$title{enhanced} ne 'on'); return($out); } else { return("\"$title\" noenhanced"); } } # Set the details of the axis labels # - called by _setChart() # # Usage example: # xlabel => { # text => "My x-axis label", # font => "arial, 14", # color => "brown", # offset => "0, -1", # rotate => 45, # }, # # TODO # - support radian and pi in "rotate" sub _setAxisLabel { my ($label) = @_; if (ref($label)) { my $out = "\"$$label{text}\""; # Location offset $out .= " offset $$label{offset}" if (defined $$label{offset}); # Font and size my $font; $font = $$label{font} if (defined $$label{font}); $font .= ",$$label{fontsize}" if (defined $$label{fontsize}); $out .= " font \"$font\"" if (defined $font); # Color $out .= " textcolor rgb \"$$label{color}\"" if (defined $$label{color}); # Switch of the enhanced mode. Default: off $out .= " noenhanced" if (!defined $$label{enhanced} || $$label{enhanced} ne 'on'); # Text rotation $out .= " rotate by $$label{rotate}" if (defined $$label{rotate}); return($out); } else { return("\"$label\" noenhanced"); } } # Set the details of the tics and tic labels # - called by _setChart() # # Usage example: # xtics => { # along => 'border', # labels => [-10, 15, 20, 25], # labelfmt => "%3f", # font => "arial", # fontsize => 14, # fontcolor => "brown", # offset => "0, -1", # start => -10, # incr => 0.2, # end => 2.6, # rotate => 45, # length => "2,1", # along => 'axis', # minor => 3, # mirror => 'off', # }, # # TODO # - implement "add" option to add addition tics other than default # - support radian and pi in "rotate" sub _setTics { my ($tic) = @_; my $out = ''; if (ref($tic) eq 'HASH') { $out .= " $$tic{along}" if (defined $$tic{along}); $out .= " nomirror" if ( defined $$tic{mirror} && $$tic{mirror} eq 'off' ); $out .= " scale $$tic{length}" if (defined $$tic{length}); $out .= " rotate by $$tic{rotate}" if (defined $$tic{rotate}); $out .= " offset $$tic{offset}" if (defined $$tic{offset}); # Tic labels if (defined $$tic{incr}) { my $location = $$tic{incr}; if (defined $$tic{start}) { $location = "$$tic{start},$location"; $location .= ",$$tic{end}" if (defined $$tic{end}); } $location = '0'.$location if ($location =~ /^\-/); $out .= " $location"; } $out .= " (". join(',', @{$$tic{labels}}) . ")" if (defined $$tic{labels}); # Font, font size and font color if (defined $$tic{font}) { my $font = $$tic{font}; $font = "$$tic{font},$$tic{fontsize}" if ($font !~ /\,/ && defined $$tic{fontsize}); $out .= " font \"$font\""; } $out .= " textcolor rgb \"$$tic{fontcolor}\"" if (defined $$tic{fontcolor}); } elsif (ref($tic) eq 'ARRAY') { $out = " (". join(',', @$tic) . ")"; } elsif ($tic ne 'on') { $out = "\"$tic\""; } return($out); } # Set the details of the grid lines # - called by _setChart() # # Usage example: # grid => { # type => 'dash, dot', # default: dot # width => 2, # default: 0 # color => 'blue', # default: black # xlines => 'on', # default: on # ylines => 'off', # default: on # zlines => 'off', # default: # x2lines => 'off', # default: off # y2lines => 'off', # default: off # layer => 'front', # default: layerdefault # }, # # minorgrid => { # width => 1, # default: 0 # color => 'gray', # default: black # xlines => 'on', # default: off # ylines => 'on', # default: off # x2lines => 'off', # default: off # y2lines => 'off', # default: off # layer => 'front', # default: layerdefault # } # # # OR # # grid => 'on', # # TODO: # - support polar grid sub _setGrid { my ($self) = @_; my $grid = $self->{grid}; my $mgrid = $self->{minorgrid} if (defined $self->{minorgrid}); my $out = ''; if (ref($grid) eq 'HASH' || ref($mgrid) eq 'HASH') { $grid = &_gridString2Hash($grid); $mgrid = &_gridString2Hash($mgrid); # Set whether the major grid lines are drawn (defined $$grid{xlines} && $$grid{xlines} =~ /^off/)? ($out .= " noxtics"): ($out .= " xtics"); (defined $$grid{ylines} && $$grid{ylines} =~ /^off/)? ($out .= " noytics"): ($out .= " ytics"); (defined $$grid{zlines} && $$grid{zlines} =~ /^off/)? ($out .= " noztics"): ($out .= " ztics"); # Set whether the vertical minor grid lines are drawn $out .= " mxtics" if ( (defined $$grid{xlines} && $$grid{xlines} =~ /,\s?on$/) || (defined $self->{minorgrid} && (!defined $$mgrid{xlines} || $$mgrid{xlines} eq 'on')) ); # Set whether the horizontal minor grid lines are drawn $out .= " mytics" if ( (defined $$grid{ylines} && $$grid{ylines} =~ /,\s?on$/) || (defined $mgrid && (!defined $$mgrid{ylines} || $$mgrid{ylines} eq 'on')) ); # Major grid on secondary axes $out .= " x2tics" if (defined $$grid{x2lines} && $$grid{x2lines} eq 'on'); $out .= " y2tics" if (defined $$grid{y2lines} && $$grid{y2lines} eq 'on'); # Minor grid on secondary axes $out .= " mx2tics" if (defined $$mgrid{x2lines} && $$mgrid{x2lines} eq 'on'); $out .= " my2tics" if (defined $$mgrid{y2lines} && $$mgrid{y2lines} eq 'on'); # Set the layer $out .= " $$grid{layer}" if (defined $$grid{layer}); # Set the line type of the grid lines my $major = my $minor = ''; my $majorType = my $minorType = 4; # dotted lines if (defined $$grid{linetype}) { $majorType = $minorType = $$grid{linetype}; ($majorType, $minorType) = split(/\,\s?/, $$grid{linetype}) if ($$grid{linetype} =~ /\,/); } $minorType = $$mgrid{linetype} if (defined $$mgrid{linetype}); $major .= " linetype ".&_lineType($majorType); $minor .= " linetype ".&_lineType($minorType); # Set the line width of the grid lines my $majorWidth = my $minorWidth = 0; if (defined $$grid{width}) { $majorWidth = $minorWidth = $$grid{width}; ($majorWidth, $minorWidth) = split(/\,\s?/, $$grid{width}) if ($$grid{width} =~ /\,/); } $minorWidth = $$mgrid{width} if (defined $$mgrid{width}); $major .= " linewidth $majorWidth"; $minor .= " linewidth $minorWidth"; # Set the line color of the grid lines my $majorColor = my $minorColor = 'black'; if (defined $$grid{color}) { $majorColor = $minorColor = $$grid{color}; ($majorColor, $minorColor) = split(/\,\s?/, $$grid{color}) if ($$grid{color} =~ /\,/); } $minorColor = $$mgrid{color} if (defined $$mgrid{color}); $major .= " linecolor rgb \"$majorColor\""; $minor .= " linecolor rgb \"$minorColor\""; $out .= "$major" if ($major ne ''); $out .= ",$minor" if ($minor ne ''); } else { if (defined $grid) { return(" $grid") if ($grid !~ /^(on|off)$/); ($grid eq 'off')? ($out = " noxtics noytics"): ($out = " xtics ytics"); } $out .= " mxtics mytics" if (defined $mgrid && $mgrid eq 'on'); } return($out); } # Convert grid string to hash # - called by _setGrid sub _gridString2Hash { my ($grid) = @_; return($grid) if (ref($grid) eq 'HASH'); my %out; $out{xlines} = $out{ylines} = $out{zlines} = $grid; return(\%out); } # Set the details of the graph border and legend box border # - called by _setChart() # # Usage example: # border => { # linetype => 3, # default: solid # width => 2, # default: 0 # color => '#ff00ff', # default: system defined # layer => 'back', # default: front # }, # # Remark: # - By default, the color of the axis tics would follow the border unless # specified otherwise. sub _setBorder { my ($border) = @_; my $out = ''; $out .= " $$border{layer}" if (defined $$border{layer}); $out .= " linetype ".&_lineType($$border{linetype}) if (defined $$border{linetype}); $out .= " linecolor rgb \"$$border{color}\"" if (defined $$border{color}); $out .= " linewidth $$border{width}" if (defined $$border{width}); return($out); } # Format the legend (key) # # Usage example: # legend => { # position => "outside bottom", # width => 3, # height => 4, # align => "right", # order => "horizontal reverse", # title => "Title of the legend", # sample => { # length => 3, # position => "left", # spacing => 2, # }, # border => { # linetype => 2, # width => 1, # color => "blue", # }, # }, sub _setLegend { my ($legend) = @_; my $out = ''; if (defined $$legend{position}) { ($$legend{position} =~ /\d/)? ($out .= " at $$legend{position}"): ($out .= " $$legend{position}"); } $out .= " width $$legend{width}" if (defined $$legend{width}); $out .= " height $$legend{height}" if (defined $$legend{height}); if (defined $$legend{align}) { $out .= " Left" if ($$legend{align} eq 'left'); $out .= " Right" if ($$legend{align} eq 'right'); } if (defined $$legend{order}) { my $order = $$legend{order}; $order =~ s/reverse/invert/; $out .= " $order"; } if (defined $$legend{title}) { if (ref($$legend{title}) eq 'HASH') { my $title = $$legend{title}; $out .= " title \"$$title{text}\""; $out .= " noenhanced" if (!defined $$title{enhanced} || $$title{enhanced} ne 'on'); } else { $out .= " title \"$$legend{title}\" noenhanced"; } } if (defined $$legend{sample}) { $out .= " samplen $$legend{sample}{length}" if (defined $$legend{sample}{length}); $out .= " reverse" if (defined $$legend{sample}{position} || $$legend{sample}{position} eq "left"); $out .= " spacing $$legend{sample}{spacing}" if (defined $$legend{sample}{spacing}); } if (defined $$legend{border}) { if (ref($$legend{border}) eq 'HASH') { $out .= " box ".&_setBorder($$legend{border}); } elsif ($$legend{border} eq "off") { $out .= " no box"; } elsif ($$legend{border} eq "on") { $out .= " box"; } } return($out); } # Set title and layout of the multiplot sub _setMultiplot { my ($self, $nrows, $ncols) = @_; open(PLT, ">>$self->{_script}") || confess("Can't write $self->{_script}"); print PLT "set multiplot"; print PLT " title \"$self->{title}\"" if (defined $self->{title}); print PLT " layout $nrows, $ncols" if (defined $nrows); print PLT "\n"; close(PLT); } # Usage example: # timestamp => { # fmt => '%d/%m/%y %H:%M', # offset => "10,-3" # font => "Helvetica", # }, # # OR # timestamp => 'on'; sub _setTimestamp { my ($ts) = @_; my $out = ''; if (ref($ts) eq 'HASH') { $out .= " \"$$ts{fmt}\"" if (defined $$ts{fmt}); $out .= " offset $$ts{offset}" if (defined $$ts{offset}); $out .= " font \"$$ts{font}\"" if (defined $$ts{font}); } elsif ($ts ne 'on') { return($ts); } return($out); } # Call Gnuplot to generate the image file sub execute { my ($self) = @_; # Try to find the executable of Gnuplot my $gnuplot = 'gnuplot'; if (defined $self->{gnuplot}) { $gnuplot = $self->{gnuplot}; } else { if ($^O =~ /MSWin/) { my $gnuplotDir = 'C:\Program Files\gnuplot'; $gnuplotDir = 'C:\Program Files (x86)\gnuplot' if (!-e $gnuplotDir); my $binDir = $gnuplotDir.'\bin'; $binDir = $gnuplotDir.'\binary' if (!-e $binDir); $gnuplot = $binDir.'\gnuplot.exe'; if (!-e $gnuplot) { $gnuplot = $binDir.'\wgnuplot.exe'; confess("Gnuplot command not found.") if (!-e $gnuplot); } } } # Execute gnuplot my $cmd = qq("$gnuplot" "$self->{_script}"); $cmd .= " -" if ($self->{terminal} =~ /^(ggi|pm|windows|wxt|x11)(\s|$)/); my $err = `$cmd 2>&1`; # my $err; # system("$cmd"); # Capture and process error message from Gnuplot if (defined $err && $err ne '') { my ($errTmp) = ($err =~ /\", line \d+:\s(.+)/); die "$errTmp\n" if (defined $errTmp); warn "$err\n"; } # Convert the image to the user-specified format if (defined $self->{_terminal} && $self->{_terminal} eq 'auto') { my @a = split(/\./, $self->{output}); my $ext = $a[-1]; &convert($self, $ext) if ($ext !~ /^e?ps$/); } return($self); } # Unset the chart properties # - called by multiplot() sub _reset { my ($self) = @_; open(PLT, ">>$self->{_script}") || confess("Can't write $self->{_script}"); foreach my $opt (@{$self->{_sets}}) { print PLT "unset $opt\n"; if ($opt =~ /range$/) { print PLT "set $opt [*:*]\n"; } elsif (!grep(/^$opt$/, qw(arrow grid label logscale object parametric)) && $opt !~ /tics$/) { print PLT "set $opt\n"; } } close(PLT); } # Arbitrary labels placed in the chart # # Usage example: # $chart->label( # text => "This is a label", # position => "0.2, 3 left", # offset => "2,2", # rotate => 45, # font => "arial, 15", # fontcolor => "dark-blue", # pointtype => 3, # pointsize => 5, # pointcolor => "blue", # layer => "front", # ); sub label { my ($self, %label) = @_; my $out = " \"$label{text}\""; $out .= " at $label{position}" if (defined $label{position}); $out .= " offset $label{offset}" if (defined $label{offset}); $out .= " rotate by $label{rotate}" if (defined $label{rotate}); $out .= " font \"$label{font}\"" if (defined $label{font}); $out .= " $label{layer}" if (defined $label{layer}); $out .= " textcolor rgb \"$label{fontcolor}\"" if (defined $label{fontcolor}); $out .= " noenhanced" if (!defined $label{enhanced} || $label{enhanced} ne 'on'); if (defined $label{pointtype} || defined $label{pointsize} || defined $label{pointcolor}) { $out .= " point"; $out .= " pointtype ".&_pointType($label{pointtype}) if (defined $label{pointtype}); $out .= " pointsize $label{pointsize}" if (defined $label{pointsize}); $out .= " linecolor rgb \"$label{pointcolor}\"" if (defined $label{pointcolor}); } push(@{$self->{_labels}}, $out); return($self); } # Arbitrary arrows placed in the chart # # Usage example: # $chart->arrow( # from => "0,2", # to => "0.3,0.1", # linetype => 'dash', # width => 2, # color => "dark-blue", # head => { # size => 3, # angle => 30, # direction => 'back', # }, # layer => "front", # ); sub arrow { my ($self, %arrow) = @_; confess("Starting position of arrow not found") if (!defined $arrow{from}); my $out = " from $arrow{from}"; $out .= " to $arrow{to}" if (defined $arrow{to}); $out .= " rto $arrow{rto}" if (defined $arrow{rto}); $out .= " $arrow{layer}" if (defined $arrow{layer}); $out .= " linetype ".&_lineType($arrow{linetype}) if (defined $arrow{linetype}); $out .= " linewidth $arrow{width}" if (defined $arrow{width}); $out .= " linecolor rgb \"$arrow{color}\"" if (defined $arrow{color}); $out .= " size $arrow{headsize}" if (defined $arrow{headsize}); # Set arrow head $out .= &_setArrowHead($arrow{head}) if (defined $arrow{head}); push(@{$self->{_arrows}}, $out); return($self); } # Arbitrary lines placed in the chart # # Usage example: # $chart->line( # from => "0,2", # to => "0.3,0.1", # linetype => 'dash', # width => 2, # color => "dark-blue", # layer => "front", # ); sub line { my ($self, %line) = @_; confess("Starting position of line not found") if (!defined $line{from}); my $out = " from $line{from}"; $out .= " to $line{to}" if (defined $line{to}); $out .= " rto $line{rto}" if (defined $line{rto}); $out .= " $line{layer}" if (defined $line{layer}); $out .= " linetype ".&_lineType($line{linetype}) if (defined $line{linetype}); $out .= " linewidth $line{width}" if (defined $line{width}); $out .= " linecolor rgb \"$line{color}\"" if (defined $line{color}); push(@{$self->{_arrows}}, "$out nohead"); # remove arrow head return($self); } # Set the options of arrow head sub _setArrowHead { my ($head) = @_; my $out = ''; # Author's comments: # - The filling of arrow head does not follow the convention of fill style # of objects and plotting styles. Perhaps Gnuplot will change this in the # future. # - Back-angle is not meaningful if filling is "nofilled". This constraint # may be removed theoretically. # - Therefore, "backangle" and "fill" are disabled for the moment. if (ref($head) eq 'HASH') { my $size = (defined $$head{size})? $$head{size} : 0.45; my $angle = (defined $$head{angle})? $$head{angle} : 15; confess("arrow head size must be greater than 0") if ($size <= 0); $out .= " size $size"; $out .= ",$angle" if ($size !~ /,/); # $out .= ",$$head{backangle}" if (defined $$head{backangle}); # $out .= " $$head{fill}" if (defined $$head{fill}); if (defined $$head{direction}) { if ($$head{direction} eq 'back') { $out .= " backhead"; } elsif ($$head{direction} eq 'both') { $out .= " heads"; } elsif ($$head{direction} eq 'off') { $out .= " nohead"; } } } else { if ($head eq 'off') { $out .= " nohead"; } elsif ($head eq 'back') { $out .= " backhead"; } elsif ($head eq 'both') { $out .= " heads"; } } return($out); } # Arbitrary rectangles placed in the chart # # Usage example: # $chart->rectangle( # from => "screen 0.2, screen 0.2", # to => "screen 0.4, screen 0.4", # fill => { # density => 0.2, # color => "#11ff11", # }, # border => {color => "blue"}, # ); sub rectangle { my ($self, %rect) = @_; # Position and dimension of the rectangle my $out = ""; $out .= " $rect{index}" if (defined $rect{index}); $out .= " rectangle"; if (defined $rect{from}) { $out .= " from $rect{from}"; if (defined $rect{to}) { $out .= " to $rect{to}"; } elsif (defined $rect{rto}) { $out .= " rto $rect{rto}"; } else { confess("Rectangle dimension not complete"); } } elsif (defined $rect{width}) { $rect{at} = $rect{center} if (defined $rect{center}); confess("Rectangle position not complete") if (!defined $rect{at}); confess("Rectangle dimension not found") if (!defined $rect{width} || !defined $rect{height}); $out .= " at $rect{at} size $rect{width},$rect{height}"; } else { confess("Rectangle position or dimension not complete"); } # Process shared object options $out .= &_setObjOpt(\%rect); push(@{$self->{_objects}}, $out); return($self); } # Arbitrary ellipses placed in the chart # # Usage example: # $chart->ellipse( # at => "screen 0.2, screen 0.2", # width => 0.2, # height => 0.5 # fill => { # density => 0.2, # color => "#11ff11", # }, # border => {color => "blue"}, # ); sub ellipse { my ($self, %elli) = @_; # - Alias of "at": "center" # - Check position and dimension information $elli{at} = $elli{center} if (defined $elli{center}); confess("Ellipse location not found") if (!defined $elli{at}); confess("Ellipse dimension not found") if (!defined $elli{width} || !defined $elli{height}); my $out = ""; $out .= " $elli{index}" if (defined $elli{index}); $out .= " ellipse at $elli{at} size $elli{width},$elli{height}"; $out .= " units $elli{units}" if (defined $elli{units}); # Process shared object options $out .= &_setObjOpt(\%elli); push(@{$self->{_objects}}, $out); return($self); } # Arbitrary circles placed in the chart # # Usage example: # $chart->circle( # at => "screen 0.2, screen 0.2", # size => 0.5 # fill => { # density => 0.2, # color => "#11ff11", # }, # border => {color => "blue"}, # ); sub circle { my ($self, %cir) = @_; # - Alias of "at": "center" # - Check position and size information $cir{at} = $cir{center} if (defined $cir{center}); confess("Circle location not found") if (!defined $cir{at}); confess("Circle size not found") if (!defined $cir{size}); my $out = ""; $out .= " $cir{index}" if (defined $cir{index}); $out .= " circle at $cir{at} size $cir{size}"; if (defined $cir{arc}) { (ref($cir{arc}) eq 'ARRAY')? ($out .= " arc [". join(':', @{$cir{arc}}) . "]"): ($out .= " arc [$cir{arc}]"); } # Process shared object options $out .= &_setObjOpt(\%cir); push(@{$self->{_objects}}, $out); return($self); } # Arbitrary polygons placed in the chart # # Usage example: # $chart->polygon( # vertices => [ # "0, -0.6", # {rto => "-1, 0.3"}, # {to => [-4, 0.4]}, # ], # ); sub polygon { my ($self, %poly) = @_; confess("Polygon vertices not found") if (!defined $poly{vertices}); my $v = $poly{vertices}; confess("Polygon starting vertex not found") if (scalar(@$v) < 0.5); my $out = ""; $out .= " $poly{index}" if (defined $poly{index}); $out .= " polygon from $$v[0]"; # Other vertices for (my $i = 1; $i < @$v; $i++) { if (ref($$v[$i]) eq 'HASH') { my @key = keys(%{$$v[$i]}); my @val = values(%{$$v[$i]}); $out .= " $key[0] $val[0]"; } else { $out .= " to $$v[$i]"; } } # Process shared object options $out .= &_setObjOpt(\%poly); push(@{$self->{_objects}}, $out); return($self); } # Set the details common to all objects sub _setObjOpt { my ($obj) = @_; my $out = ""; $out .= " $$obj{layer}" if (defined $$obj{layer}); $out .= " linewidth $$obj{linewidth}" if (defined $$obj{linewidth}); # Set filling color / pattern and border if (defined $$obj{fill}) { my $fill = $$obj{fill}; $out .= " fillcolor rgb \"$$fill{color}\"" if (defined $$fill{color}); $out .= " fillstyle". &_fillStyle($fill); # Set details of the border if (defined $$obj{border}) { if (ref($$obj{border}) eq 'HASH') { $out .= " border"; $out .= " linecolor rgb \"$$obj{border}{color}\"" if (defined $$obj{border}{color}); } elsif ($$obj{border} =~ /^(off|no)$/) { $out .= " noborder"; } } } elsif (defined $$obj{border}) { if (ref($$obj{border}) eq 'HASH') { $out .= " fillstyle border"; $out .= " linecolor rgb \"$$obj{border}{color}\"" if (defined $$obj{border}{color}); } elsif ($$obj{border} =~ /^(off|no)$/) { $out .= " noborder"; } } return($out); } # Output a test image for the terminal # # Usage example: # $chart = Chart::Gnuplot->new(output => "test.png"); # $chart->test; sub test { my ($self) = @_; my $pltTmp = "$self->{_script}"; open(PLT, ">$pltTmp") || confess("Can't write gnuplot script $pltTmp"); print PLT "set terminal $self->{terminal}\n"; print PLT "set output \"$self->{output}\"\n"; print PLT "test\n"; close(PLT); # Execute gnuplot my $gnuplot = 'gnuplot'; $gnuplot = $self->{gnuplot} if (defined $self->{gnuplot}); system("$gnuplot $pltTmp"); # Convert the image to the user-specified format if (defined $self->{_terminal} && $self->{_terminal} eq 'auto') { my @a = split(/\./, $self->{output}); my $ext = $a[-1]; &convert($self, $ext) if ($ext !~ /^e?ps$/); } return($self); } # Create animated gif # # Usage example: # $chart->animate( # charts => \@charts, # sequence of chart object # delay => 10, # delay in units of 0.01 second # ); sub animate { my ($self, %animate) = @_; my $charts = $animate{charts}; # Force the terminal to be 'gif' # - Only the 'gif' terminal supports animation if (defined $self->{_terminal} && $self->{_terminal} eq 'auto') { $self->{terminal} = $self->{_terminal} = 'gif'; } elsif ($self->{terminal} !~ /^gif/) { croak "animate() is supported only by the gif terminal"; } $self->{terminal} .= " animate"; $self->{terminal} .= " delay $animate{delay}" if (defined $animate{delay}); &_setChart($self); open(PLT, ">>$self->{_script}") || confess("Can't write $self->{_script}"); foreach my $chart (@$charts) { $chart->_script($self->{_script}); $chart->_multiplot(1); my $plot; my @dataSet; if (defined $chart->{_dataSets2D}) { $plot = 'plot'; @dataSet = @{$chart->{_dataSets2D}}; } elsif (defined $chart->{_dataSets3D}) { $plot = 'splot'; @dataSet = @{$chart->{_dataSets3D}}; } &_setChart($chart, \@dataSet); open(PLT, ">>$self->{_script}") || confess("Can't write $self->{_script}"); print PLT "\n$plot "; print PLT join(', ', map {$_->_thaw($self)} @dataSet), "\n"; close(PLT); &_reset($chart); } # Generate image file &execute($self); return($self); } # Change the image format # - called by plot2d() # # Usage example: # my $chart = Chart::Gnuplot->new(...); # my $data = Chart::Gnuplot::DataSet->new(...); # $chart->plot2d($data); # $chart->convert('gif'); sub convert { my ($self, $imgfmt) = @_; return($self) if (!-e $self->{output}); # Generate temp file my $temp = "$self->{_script}.tmp"; move($self->{output}, $temp); # Execute gnuplot my $convert = 'convert'; $convert = $self->{convert} if (defined $self->{convert}); # Rotate 90 deg for landscape image if (defined $self->{orient} && $self->{orient} eq 'portrait') { my $cmd = qq("$convert" $temp $temp.$imgfmt 2>&1); my $err = `$cmd`; if (defined $err && $err ne '') { die "Unsupported image format ($imgfmt)\n" if ($err =~ /^convert: unable to open module file/); my ($errTmp) = ($err =~ /^convert: (.+)/); die "$errTmp Perhaps the image format is not supported\n" if (defined $errTmp); die "$err\n"; } } else { my $cmd = qq("$convert" -rotate 90 $temp $temp.$imgfmt 2>&1); my $err = `$cmd`; if (defined $err && $err ne '') { die "Unsupported image format ($imgfmt)\n" if ($err =~ /^convert: unable to open module file/); my ($errTmp) = ($err =~ /^convert: (.+)/); die "$errTmp Perhaps the image format is not supported\n" if (defined $errTmp); die "$err\n"; } } # Remove the temp file move("$temp.$imgfmt", $self->{output}); unlink($temp); return($self); } # Change the image format to PNG # # Usage example: # my $chart = Chart::Gnuplot->new(...); # my $data = Chart::Gnuplot::DataSet->new(...); # $chart->plot2d($data)->png; sub png { my $self = shift; &convert($self, 'png'); return($self) } # Change the image format to GIF # # Usage example: # my $chart = Chart::Gnuplot->new(...); # my $data = Chart::Gnuplot::DataSet->new(...); # $chart->plot2d($data)->gif; sub gif { my $self = shift; &convert($self, 'gif'); return($self) } # Change the image format to JPG # # Usage example: # my $chart = Chart::Gnuplot->new(...); # my $data = Chart::Gnuplot::DataSet->new(...); # $chart->plot2d($data)->jpg; sub jpg { my $self = shift; &convert($self, 'jpg'); return($self) } # Change the image format to PS # # Usage example: # my $chart = Chart::Gnuplot->new(...); # my $data = Chart::Gnuplot::DataSet->new(...); # $chart->plot2d($data)->ps; sub ps { my $self = shift; &convert($self, 'ps'); return($self) } # Change the image format to PDF # # Usage example: # my $chart = Chart::Gnuplot->new(...); # my $data = Chart::Gnuplot::DataSet->new(...); # $chart->plot2d($data)->pdf; sub pdf { my $self = shift; &convert($self, 'pdf'); return($self) } # Copy method of the chart object sub copy { my ($self, $num) = @_; my @clone = &_copy(@_); foreach my $clone (@clone) { my $dirTmp = tempdir(CLEANUP => 1); ($^O =~ /MSWin/)? ($dirTmp .= '\\'): ($dirTmp .= '/'); $clone->{_script} = $dirTmp . "plot"; } return($clone[0]) if (!defined $num); return(@clone); } ################## Chart::Gnuplot::DataSet class ################## package Chart::Gnuplot::DataSet; use strict; use Carp; use File::Temp qw(tempdir); use Chart::Gnuplot::Util qw(_lineType _pointType _fillStyle _copy); # Constructor sub new { my ($class, %hash) = @_; my $dirTmp = tempdir(CLEANUP => 1); ($^O =~ /MSWin/)? ($dirTmp .= '\\'): ($dirTmp .= '/'); $hash{_data} = $dirTmp . "data"; my $self = \%hash; return bless($self, $class); } # Generic attribute methods sub AUTOLOAD { my ($self, $key) = @_; my $attr = our $AUTOLOAD; $attr =~ s/.*:://; return if ($attr eq 'DESTROY'); # ignore destructor $self->{$attr} = $key if (defined $key); return($self->{$attr}); } # xdata get-set method sub xdata { my ($self, $xdata) = @_; return($self->{xdata}) if (!defined $xdata); delete $self->{points}; delete $self->{datafile}; delete $self->{func}; $self->{xdata} = $xdata; } # ydata get-set method sub ydata { my ($self, $ydata) = @_; return($self->{ydata}) if (!defined $ydata); delete $self->{points}; delete $self->{datafile}; delete $self->{func}; $self->{ydata} = $ydata; } # zdata get-set method sub zdata { my ($self, $zdata) = @_; return($self->{zdata}) if (!defined $zdata); delete $self->{points}; delete $self->{datafile}; delete $self->{func}; $self->{zdata} = $zdata; } # points get-set method sub points { my ($self, $points) = @_; return($self->{points}) if (!defined $points); delete $self->{xdata}; delete $self->{ydata}; delete $self->{zdata}; delete $self->{datafile}; delete $self->{func}; $self->{points} = $points; } # datafile get-set method sub datafile { my ($self, $datafile) = @_; return($self->{datafile}) if (!defined $datafile); delete $self->{xdata}; delete $self->{ydata}; delete $self->{zdata}; delete $self->{points}; delete $self->{func}; $self->{datafile} = $datafile; } # func get-set method sub func { my ($self, $func) = @_; return($self->{func}) if (!defined $func); delete $self->{xdata}; delete $self->{ydata}; delete $self->{zdata}; delete $self->{points}; delete $self->{datafile}; $self->{func} = $func; } # Copy method of the data set object sub copy { my ($self, $num) = @_; my @clone = &_copy(@_); foreach my $clone (@clone) { my $dirTmp = tempdir(CLEANUP => 1); ($^O =~ /MSWin/)? ($dirTmp .= '\\'): ($dirTmp .= '/'); $clone->{_data} = $dirTmp . "data"; } return($clone[0]) if (!defined $num); return(@clone); } # Thaw the data set object # - call _fillStyle() # _ call different _thaw*() # # TODO: # - data file delimiter # - data labels sub _thaw { my ($self, $chart) = @_; my $string; my $using = ''; # Data points stored in arrays # - in any case, ydata need to be defined if (defined $self->{ydata}) { my $fileTmp = $self->{_data}; $string = "'$fileTmp'"; # Process 3D data set # - zdata is defined if (defined $self->{zdata}) { $using = (ref($self->{xdata}->[0]) eq 'ARRAY')? &_thawXYZGrid($self) : &_thawXYZ($self); } # Treatment for financebars and candlesticks styles # - Both xdata and ydata are defined elsif (defined $self->{xdata} && defined $self->{style} && $self->{style} =~ /^(financebars|candlesticks)$/) { $using = &_thawXYFinance($self); } # Treatment for errorbars and errorlines styles # - Both xdata and ydata are defined # - Style is defined and contain "error" elsif (defined $self->{xdata} && defined $self->{style} && $self->{style} =~ /error/) { # Error bars along x-axis if ($self->{style} =~ /^xerror/) { $using = &_thawXYXError($self); } # Error bars along y-axis elsif ($self->{style} =~ /^(y|box)error/) { $using = &_thawXYYError($self); } # Error bars along both x and y-axis elsif ($self->{style} =~ /^(box)?xyerror/) { $using = &_thawXYXYError($self); } } # Treatment for hbars # - use "boxxyerrorbars" style to mimic elsif (defined $self->{xdata} && defined $self->{style} && $self->{style} eq 'hbars') { &_thawXYHbars($self); } # Treatment for hlines # - use "boxxyerrorbars" style to mimic elsif (defined $self->{xdata} && defined $self->{style} && $self->{style} eq 'hlines') { &_thawXYHlines($self); } elsif (defined $self->{xdata} && defined $self->{style} && $self->{style} eq 'histograms') { $using = &_thawXYHistograms($self); } # Normal x-y plot # - Both xdata and ydata are defined elsif (defined $self->{xdata}) { $using = &_thawXY($self); } # Only ydata is defined # - Plot ydata against index else { # Treatment for financebars and candlesticks styles if (defined $self->{style} && $self->{style} =~ /^(financebars|candlesticks)$/) { &_thawYFinance($self); } # Treatment for errorbars and errorlines styles # - Style is defined and contain "error" elsif (defined $self->{style} && $self->{style} =~ /^yerror/) { &_thawYError($self); } # Other plotting styles else { &_thawY($self); } $using = "1:2" if (defined $self->{timefmt}); } } # Data in points elsif (defined $self->{points}) { my $pt = $self->{points}; my $fileTmp = $self->{_data}; $string = "'$fileTmp'"; # Horizontal lines plotting style if (defined $self->{style} && $self->{style} eq 'hlines') { &_thawPointsHLines($self); } # Horizontal bars plotting style elsif (defined $self->{style} && $self->{style} eq 'hbars') { &_thawPointsHBars($self); } # Horizontal bars plotting style elsif (defined $self->{style} && $self->{style} eq 'histograms') { $using = &_thawPointsHistograms($self); } # 3D grid data points elsif (ref($$pt[0][0]) eq 'ARRAY') { $using = &_thawPointsGrid($self); } else { $using = &_thawPoints($self); } } # File elsif (defined $self->{datafile}) { $string = "'$self->{datafile}'"; $string .= " every $self->{every}" if (defined $self->{every}); $string .= " index $self->{index}" if (defined $self->{index}); } # Function elsif (defined $self->{func}) { # Parametric function if (ref($self->{func}) eq 'HASH') { if (defined ${$self->{func}}{z}) { $string = "${$self->{func}}{x},${$self->{func}}{y},". "${$self->{func}}{z}"; } else { $string = "${$self->{func}}{x},${$self->{func}}{y}"; } } else { $string = "$self->{func}"; } } else { croak("Unknown or undefined data source"); } # Process the Gnuplot "using" feature $using = $self->{using} if (defined $self->{using}); $string .= " using $using" if ($using ne ''); # Add title for the data sets (defined $self->{title})? ($string .= " title \"$self->{title}\""): ($string .= " title \"\""); # Change plotting style, color, width and point size $string .= " smooth $self->{smooth}" if (defined $self->{smooth}); $string .= " axes $self->{axes}" if (defined $self->{axes}); $string .= " with $self->{style}" if (defined $self->{style}); $string .= " linetype ".&_lineType($self->{linetype}) if (defined $self->{linetype}); $string .= " linecolor rgb \"$self->{color}\"" if (defined $self->{color}); $string .= " linewidth $self->{width}" if (defined $self->{width}); $string .= " pointtype ".&_pointType($self->{pointtype}) if (defined $self->{pointtype}); $string .= " pointsize $self->{pointsize}" if (defined $self->{pointsize}); # Filling style of the curve if (defined $self->{fill}) { $string .= " fill".&_fillStyle($self->{fill}); # Set details of the border if (defined $self->{border}) { if (ref($self->{border}) eq 'HASH') { $string .= " border"; $string .= " linecolor rgb \"$self->{border}{color}\"" if (defined $self->{border}{color}); } elsif ($self->{border} =~ /^(off|no)$/) { $string .= " noborder"; } } } return($string); } # Process input data of array of y sub _thawY { my ($ds) = @_; my $ydata = $ds->{ydata}; # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @$ydata; $i++) { print DATA "$i $$ydata[$i]\n"; } close(DATA); } # Process input data of array of y for plotting style "yerror..." sub _thawYError { my ($ds) = @_; my $ydata = $ds->{ydata}; # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @{$$ydata[0]}; $i++) { print DATA "$i $$ydata[0][$i]"; for (my $j = 1; $j < @$ydata; $j++) { print DATA " $$ydata[$j][$i]"; } print DATA "\n"; } close(DATA); } # Process input data of array of y for plotting financial time series sub _thawYFinance { my ($ds) = @_; my $ydata = $ds->{ydata}; # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @{$$ydata[0]}; $i++) { print DATA "$i $$ydata[0][$i] $$ydata[1][$i] ". "$$ydata[2][$i] $$ydata[3][$i]\n"; } close(DATA); } # Process input data of array of x and y sub _thawXY { my ($ds) = @_; my $xdata = $ds->{xdata}; my $ydata = $ds->{ydata}; croak("x-data and y-data have unequal length") if (scalar(@$ydata) != scalar(@$xdata)); # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @$xdata; $i++) { print DATA "$$xdata[$i] $$ydata[$i]\n"; } close(DATA); # Construst using statement for date-time data my $using = ''; if (defined $ds->{timefmt}) { my @a = split(/\s+/, $$xdata[0]); my $yCol = scalar(@a) + 1; $using = "1:$yCol"; } return($using); } # Process input data of array of x and y for plotting style "xerror..." sub _thawXYXError { my ($ds) = @_; my $xdata = $ds->{xdata}; my $ydata = $ds->{ydata}; croak("x-data and y-data have unequal length") if (scalar(@{$$xdata[0]}) != scalar(@$ydata)); # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @$ydata; $i++) { print DATA "$$xdata[0][$i] $$ydata[$i]"; for (my $j = 1; $j < @$xdata; $j++) { print DATA " $$xdata[$j][$i]"; } print DATA "\n"; } close(DATA); # Construst using statement for date-time data my $using = ''; if (defined $ds->{timefmt}) { my ($xTmp) = (ref($$xdata[0]) eq 'ARRAY')? ($$xdata[0][0]): ($$xdata[0]); my @a = split(/\s+/, $xTmp); my $yCol = scalar(@a) + 1; $using = "1:$yCol"; } return($using); } # Process input data of array of x and y for plotting style "yerror..." sub _thawXYYError { my ($ds) = @_; my $xdata = $ds->{xdata}; my $ydata = $ds->{ydata}; croak("x-data and y-data have unequal length") if (scalar(@{$$ydata[0]}) != scalar(@$xdata)); # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @$xdata; $i++) { print DATA "$$xdata[$i] $$ydata[0][$i]"; for (my $j = 1; $j < @$ydata; $j++) { print DATA " $$ydata[$j][$i]"; } print DATA "\n"; } close(DATA); # Construst using statement for date-time data my $using = ''; if (defined $ds->{timefmt}) { my ($xTmp) = (ref($$xdata[0]) eq 'ARRAY')? ($$xdata[0][0]): ($$xdata[0]); my @a = split(/\s+/, $xTmp); my $yCol = scalar(@a) + 1; $using = "1:$yCol"; } return($using); } # Process input data of array of x and y for plotting style "xyerror..." sub _thawXYXYError { my ($ds) = @_; my $xdata = $ds->{xdata}; my $ydata = $ds->{ydata}; # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); if (scalar(@$xdata) == scalar(@$ydata)) { for (my $i = 0; $i < @{$$xdata[0]}; $i++) { print DATA "$$xdata[0][$i] $$ydata[0][$i]"; for (my $j = 1; $j < @$ydata; $j++) { print DATA " $$xdata[$j][$i] $$ydata[$j][$i]"; } print DATA "\n"; } } else { for (my $i = 0; $i < @{$$xdata[0]}; $i++) { print DATA "$$xdata[0][$i] $$ydata[0][$i]"; if (scalar(@$xdata) == 2) { my $ltmp = $$xdata[0][$i] - $$xdata[1][$i]*0.5; my $htmp = $$xdata[0][$i] + $$xdata[1][$i]*0.5; print DATA " $ltmp $htmp ". "$$ydata[1][$i] $$ydata[2][$i]\n"; } else { my $ltmp = $$ydata[0][$i] - $$ydata[1][$i]*0.5; my $htmp = $$ydata[0][$i] - $$ydata[1][$i]*0.5; print DATA " $$xdata[1][$i] $$xdata[2][$i] ". "$ltmp $htmp\n"; } } } close(DATA); # Construst using statement for date-time data my $using = ''; if (defined $ds->{timefmt}) { my ($xTmp) = (ref($$xdata[0]) eq 'ARRAY')? ($$xdata[0][0]): ($$xdata[0]); my @a = split(/\s+/, $xTmp); my $yCol = scalar(@a) + 1; $using = "1:$yCol"; } return($using); } # Process input data of array of x and y for plotting financial time series sub _thawXYFinance { my ($ds) = @_; my $xdata = $ds->{xdata}; my $ydata = $ds->{ydata}; croak("x-data and y-data have unequal length") if (scalar(@{$$ydata[0]}) != scalar(@$xdata)); # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @$xdata; $i++) { print DATA "$$xdata[$i] $$ydata[0][$i] $$ydata[1][$i] ". "$$ydata[2][$i] $$ydata[3][$i]\n"; } close(DATA); # Construst using statement for date-time data my $using = ''; if (defined $ds->{timefmt}) { my @a = split(/\s+/, $$xdata[0]); my $yCol = scalar(@a) + 1; $using = "1:".join(':', ($yCol .. $yCol+3)); } return($using); } # Process input data of arrays of x and y for plottiny style "hlines" sub _thawXYHlines { my ($ds) = @_; my $xdata = $ds->{xdata}; my $ydata = $ds->{ydata}; # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @$xdata; $i++) { print DATA "0 $$ydata[$i] 0 $$xdata[$i] $$ydata[$i] ". "$$ydata[$i]\n"; } close(DATA); $ds->{style} = "boxxyerrorbars"; } # Process input data of arrays of x and y for plottiny style "hbars" sub _thawXYHbars { my ($ds) = @_; my $xdata = $ds->{xdata}; my $ydata = $ds->{ydata}; # Put the corrdinates in a hash my %points; for (my $i = 0; $i < @$xdata; $i++) { $points{$$xdata[$i]} = $$ydata[$i]; } # Sort x and y according to y values my (@sortX, @sortY) = (); foreach my $sx (sort {$points{$a} <=> $points{$b}} keys %points) { push(@sortX, $sx); push(@sortY, $points{$sx}); } my $ylow = my $yhigh = $sortY[0]; if (scalar(@sortY) > 1) { $ylow = 0.5*(3*$sortY[0]-$sortY[1]); $yhigh = 0.5*(3*$sortY[-1]-$sortY[-2]); } # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @$xdata; $i++) { $ylow = 0.5*($sortY[$i]+$sortY[$i-1]) if ($i > 0); $yhigh = ($i < $#sortY)? 0.5*($sortY[$i]+$sortY[$i+1]) : 2.0*$sortY[$i] - $ylow; print DATA "0 $sortY[$i] 0 $sortX[$i] $ylow $yhigh\n"; } close(DATA); $ds->{style} = "boxxyerrorbars"; } # Process input data of arrays of x and y for plottiny style "histograms" sub _thawXYHistograms { my ($ds) = @_; my $xdata = $ds->{xdata}; my $ydata = $ds->{ydata}; croak("x-data and y-data have unequal length") if (scalar(@$ydata) != scalar(@$xdata)); my $using; # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); if (ref($$ydata[0]) eq 'ARRAY') { for (my $i = 0; $i < @$xdata; $i++) { print DATA "\"$$xdata[$i]\" " . join(' ', @{$$ydata[$i]}) . "\n"; } $using = join(':', (2 .. scalar(@{$$ydata[0]})+1)) . ":xticlabels(1)"; } else { for (my $i = 0; $i < @$xdata; $i++) { print DATA "\"$$xdata[$i]\" $$ydata[$i]\n"; } $using = "2:xticlabels(1)"; } close(DATA); return($using); } # Process input data of array of x, y and z sub _thawXYZ { my ($ds) = @_; my $xdata = $ds->{xdata}; my $ydata = $ds->{ydata}; my $zdata = $ds->{zdata}; croak("x-data and y-data have unequal length") if (scalar(@$ydata) != scalar(@$xdata)); croak("y-data and z-data have unequal length") if (scalar(@$ydata) != scalar(@$zdata)); # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @$xdata; $i++) { print DATA "$$xdata[$i] $$ydata[$i] $$zdata[$i]\n"; } close(DATA); # Construst using statement for date-time data my $using = ''; if (defined $ds->{timefmt}) { my @a = split(/\s+/, $$xdata[0]); my $yCol = scalar(@a) + 1; $using = "1:$yCol"; my @b = split(/\s+/, $$ydata[0]); my $zCol = scalar(@b) + $yCol; $using .= ":$zCol"; } return($using); } # Process input data of matrice of x, y and z sub _thawXYZGrid { my ($ds) = @_; my $xdata = $ds->{xdata}; my $ydata = $ds->{ydata}; my $zdata = $ds->{zdata}; croak("x-data and y-data have unequal length") if (scalar(@$ydata) != scalar(@$xdata)); croak("y-data and z-data have unequal length") if (scalar(@$ydata) != scalar(@$zdata)); # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @$xdata; $i++) { for (my $j = 0; $j < @{$$xdata[$i]}; $j++) { print DATA "$$xdata[$i][$j] $$ydata[$i][$j] $$zdata[$i][$j]\n"; } print DATA "\n"; } close(DATA); # Construst using statement for date-time data my $using = ''; if (defined $ds->{timefmt}) { my @a = split(/\s+/, $$xdata[0][0]); my $yCol = scalar(@a) + 1; $using = "1:$yCol"; my @b = split(/\s+/, $$ydata[0][0]); my $zCol = scalar(@b) + $yCol; $using .= ":$zCol"; } return($using); } # Process input data of array of points sub _thawPoints { my ($ds) = @_; # Write data into temp file my $pt = $ds->{points}; my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @$pt; $i++) { print DATA join(" ", @{$$pt[$i]}), "\n"; } close(DATA); # Construst using statement for date-time data my $using = ''; if (defined $ds->{timefmt}) { my $col = 1; $using = "1"; for (my $i = 0; $i < @{$$pt[0]}-1; $i++) { my @a = split(/\s+/, $$pt[0][$i]); $col += scalar(@a); $using .= ":$col"; } } return($using); } # Process input data of array of points for plotting style "hlines" sub _thawPointsHLines { my ($ds) = @_; confess("Data/time input data is not supported in hlines plotting style") if (defined $ds->{timefmt}); # Write data into temp file my $pt = $ds->{points}; my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); # hlines plotting style for (my $i = 0; $i < @$pt; $i++) { print DATA "0 $$pt[$i][1] 0 $$pt[$i][0] $$pt[$i][1] $$pt[$i][1]\n"; } $ds->{style} = "boxxyerrorbars"; close(DATA); } # Process input data of array of points for plotting style "hbars" sub _thawPointsHBars { my ($ds) = @_; confess("Data/time input data is not supported in hbars plotting style") if (defined $ds->{timefmt}); my $pt = $ds->{points}; # Put the corrdinates in a hash my %points; for (my $i = 0; $i < @$pt; $i++) { $points{$$pt[$i][0]} = $$pt[$i][1]; } # Sort x and y according to y values my (@sortX, @sortY) = (); foreach my $sx (sort {$points{$a} <=> $points{$b}} keys %points) { push(@sortX, $sx); push(@sortY, $points{$sx}); } my $ylow = my $yhigh = $sortY[0]; if (scalar(@sortY) > 1) { $ylow = 0.5*(3*$sortY[0]-$sortY[1]); $yhigh = 0.5*(3*$sortY[-1]-$sortY[-2]); } # Write data into temp file my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @$pt; $i++) { $ylow = 0.5*($sortY[$i]+$sortY[$i-1]) if ($i > 0); $yhigh = ($i < $#sortY)? 0.5*($sortY[$i]+$sortY[$i+1]) : 2.0*$sortY[$i] - $ylow; print DATA "0 $sortY[$i] 0 $sortX[$i] $ylow $yhigh\n"; } close(DATA); $ds->{style} = "boxxyerrorbars"; close(DATA); } # Process input data of array of points for plotting histograms sub _thawPointsHistograms { my ($ds) = @_; # Write data into temp file my $pt = $ds->{points}; my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); my $numCol = scalar(@{$$pt[0]}); for (my $i = 0; $i < @$pt; $i++) { print DATA "\"$$pt[$i][0]\" ", join(' ', @{$$pt[$i]}[1 .. $numCol-1]), "\n"; } close(DATA); my $using = join(':', (2 .. $numCol)) . ":xticlabels(1)"; return($using); } # Process input data of a matrix of points sub _thawPointsGrid { my ($ds) = @_; # Write data into temp file my $pt = $ds->{points}; my $fileTmp = $ds->{_data}; open(DATA, ">$fileTmp") || confess("Can't write data to temp file"); for (my $i = 0; $i < @$pt; $i++) { for (my $j = 0; $j < @{$$pt[$i]}; $j++) { print DATA join(" ", @{$$pt[$i][$j]}), "\n"; } print DATA "\n"; } close(DATA); # Construst using statement for date-time data my $using = ''; if (defined $ds->{timefmt}) { my $col = 1; $using = "1"; for (my $i = 0; $i < @{$$pt[0][0]}-1; $i++) { my @a = split(/\s+/, $$pt[0][0][$i]); $col += scalar(@a); $using .= ":$col"; } } return($using); } # Curve fitting method # # NOTICE: This feature is experimental and in alpha phase. # # Usage example: # my $dataSet = Chart::Gnuplot::DataSet->new(...); # # my $dataFit = $dataSet->fit( # func => "a*x + b", # linear fit # vars => 'x', # params => {a => -1, b => 0.5}, # seed # ); # # print "a = $dataFit->{params}->{a}\n"; # print "b = $dataFit->{params}->{b}\n"; # # # Plot the raw data set and fitted curve # $chart->plot2d($dataSet, $dataFit); sub fit { my ($self, %hash) = @_; my $script = my $data = my $result = my $log = $self->{_data}; my $styleTmp = (defined $self->{style})? $self->{style} : 'lines'; # Filename of the temp files $script =~ s/\/data$/\/fit\.script/; $result =~ s/\/data$/\/fit\.result/; $log =~ s/\/data$/\/fit\.log/; # Prepare parameter and error string for printing my $paraString = my $paraList = my $errList = ''; my @params = (); my $paraRef = ref($hash{params}); if ($paraRef eq 'HASH') { @params = keys %{$hash{params}}; my @err = (); my $parFile = $self->{_data}; $parFile =~ s/\/data$/\/par\.dat/; open(PARA, ">$parFile") || confess "Can't write parameter to $parFile"; foreach my $pTmp (@params) { my $vTmp = (defined ${$hash{params}}{$pTmp})? ${$hash{params}}{$pTmp} : 1.0; print PARA "$pTmp = $vTmp\n"; push(@err, $pTmp . "_err"); } close(PARA); $paraString = "\"$parFile\""; $paraList = join(',', @params); $errList = join(',', @err); } elsif ($paraRef eq 'ARRAY') { @params = @{$hash{params}}; my @err = map {$_ . '_err'} @params; $paraString = $paraList = join(',', @params); $errList = join(',', @err); } else { @params = split(/,\s*/, $hash{params}); my @err = map {$_ . '_err'} @params; $paraString = $paraList = $hash{params}; $errList = join(',', @err); } if (!defined $hash{using}) { my @col = split(/\s*,\s*/, $hash{vars}); my $numCol = scalar(@col) + 1; if (ref($self->{ydata}->[0]) eq 'ARRAY') { $numCol++; $self->{style} = 'yerror'; # temp style for data file generation } $hash{using} = join(':', (1 .. $numCol)); } $self->_thaw() if (!-e $data); # generate data file $self->{style} = $styleTmp; # Generate gnuplot script for curve fitting open(FIT, ">$script") || confess("Can't generate script to $script"); print FIT "set fit logfile \"$log\" errorvariables\n"; print FIT "set print \"$result\"\n"; print FIT "fit $hash{func} \"$data\" using $hash{using}". " via $paraString\n"; print FIT "print $paraList\n"; print FIT "print $errList\n"; close(FIT); # Call gnuplot system("gnuplot $script >& /dev/null"); # Read and parse the result file open(RES, $result) || confess("Can't read fitting result $result"); chomp(my ($pLine, $eLine) = ); close(RES); # Save the result in DataSet object my %param; my @pVal = split(/\s+/, $pLine); my @eVal = split(/\s+/, $eLine); my $fitted = ''; for (my $i = 0; $i < @pVal; $i++) { $param{$params[$i]} = $pVal[$i]; $param{$params[$i]."_err"} = $eVal[$i]; $fitted .= "$params[$i] = $pVal[$i],"; } $fitted .= $hash{func}; my $outDS = Chart::Gnuplot::DataSet->new( func => $fitted, params => \%param, ); return($outDS); } 1; __END__ =head1 NAME Chart::Gnuplot - Plot graph using Gnuplot in Perl on the fly =head1 SYNOPSIS use Chart::Gnuplot; # Data my @x = (-10 .. 10); my @y = (0 .. 20); # Create chart object and specify the properties of the chart my $chart = Chart::Gnuplot->new( output => "fig/simple.png", title => "Simple testing", xlabel => "My x-axis label", ylabel => "My y-axis label", .... ); # Create dataset object and specify the properties of the dataset my $dataSet = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, title => "Plotting a line from Perl arrays", style => "linespoints", .... ); # Plot the data set on the chart $chart->plot2d($dataSet); ################################################## # Plot many data sets on a single chart $chart->plot2d($dataSet1, $dataSet2, ...); =head1 DESCRIPTION This Perl module is to plot graphs uning GNUPLOT on the fly. In order to use this module, gnuplot need to be installed. If image format other than PS and EPS is required to generate, it is recommended to install the convert program of ImageMagick as well. Please refer to L for details. To plot chart using Chart::Gnuplot, a chart object and at least one dataset object are required. Information about the chart such as output file, chart title, axes labels and so on is specified in the chart object. Dataset object contains information about the dataset to be plotted, including source of the data points, dataset label, color used to plot and more. After chart object and dataset object(s) are created, the chart can be plotted using the L, L or L method of the chart object, e.g. # $chart is the chart object $chart->plot2d($dataSet1, $dataSet2, ...); To illustate the features of Chart::Gnuplot, the best way is to show by examples. A lot of examples can be found in SourceForge L. =head1 MECHANISM OF THIS MODULE Casual users may skip this session. When the plotting method (e.g. L) is called, Chart::Gnuplot would generate a Gnuplot script based on the information in the chart object and dataset object. Then it would call the Gnuplot program. Unless specified explicitly in L of the Chart object, Chart::Gnuplot would by default generate the image in PS format first and then convert the image (by ImageMagick) based on the extension of the filename. The rationale of this approach is that the postscript terminal is so far the best developed teriminal and so this would let users to enjoy the power of Gnuplot as much as possible. Because the default terminal is postscript, if ImageMagick is not installed, you would always need to specify the L if the output format is not PS (or EPS). On the other hand, for some image formats, e.g. mousing supported SVG, which ImageMagick cannot be converted to, the terminal must be set explicitly (e.g., C in this case). =head1 CHART OBJECT The chart object can be initiated by the c method. Properties of the chart may be specified optionally when the object is initiated: my $chart = Chart::Gnuplot->new(%options); =head2 Chart Options =head3 output Output file of the graph. E.g. output => "fig/chart.png", By default, the image format is detected automatically by the extension of the filename. (Please refer to L for details). However, it can also be changed manually by the L option or the format conversion methods such as L and L. Some of image formats that can be detected automatically are: bmp : Microsoft Windows bitmap epdf : Encapsulated Portable Document Format epi : Encapsulated PostScript Interchange format eps : Encapsulated PostScript gif : Graphics Interchange Format jpg : Joint Photographic Experts Group JFIF format pdf : Portable Document Format png : Portable Network Graphics ppm : Portable Pixmap Format ps : PostScript file psd : Adobe Photoshop bitmap file xpm : X Windows system pixmap If the filename has no extension, postscipt format will be output. =head3 title Title of the chart. E.g., title => "Chart title" Properties of the chart title can be specified in hash. E.g., title => { text => "Chart title", font => "arial, 20", .... } Supported properties are: text : title in plain text font : font face (and optionally font size) color : font color offset : offset relative to the default position enhanced : title contains subscript/superscipt/greek? (on/off) Default values would be used for properties not specified. These properties has no effect on the main title of the multi-chart (see L). =head3 xlabel, ylabel, zlabel Label of the x-axis, y-axis and z-axis. E.g. xlabel => "Bottom axis label" Properties of the axis label can be specified in hash, similar to the chart title. Supported properties are: text : title in plain text font : font face (and optionally font size) color : font color offset : offset relative to the default position rotate : rotation in degrees enhanced : title contains subscript/superscipt/greek? (on/off) =head3 x2label, y2label Label of the secondary x-axis (displayed on the top of the graph) and the secondary y-axis (displayed on the right of the graph). See L. =head3 xrange, yrange, zrange Range of the x-axis, y-axis and z-axis in the plot, e.g. xrange => [0, "pi"] would make the plot from x = 0 to x = 3.14159... =head3 x2range, y2range Range of the secondary (top horizontal and right vertical) axes of the plot. See L. =head3 trange, urange, vrange Range of the parametric parameter (t for 2D plots, while u and v for 3D plots). See L. =head3 xtics, ytics, ztics The tics and tic label on the x-axis, y-axis and z-axis. E.g. xtics => { labels => [-10, 15, 20, 25], labelfmt => "%3f", .... } If you set this to C. E.g., xtics => undef Then this option will be explicitly I and the chart will have not have tic marks on the specified axis. Supported properties are: labels : the locations of the tic labels start : the starting value for manually-specified range incr : the increment for manually-specified range end : the ending value for manually-specified range labelfmt : format of the labels font : font of the labels fontsize : font size of the lebals fontcolor : font color of the label offset : position of the tic labels shifted from its default rotate : rotation of the tic labels length : length of the tics along : where the tics are put (axis/border) minor : number of minor tics between adjacant major tics mirror : turn on and off the tic label of the secondary axis. No effect : for C (on/off) =head3 x2tics, y2tics The tics and tic label of the secondary axes. See L. =head3 legend Legend describing the plots. Supported properties are: position : position of the legend width : number of character widths to be added or subtracted to the : region of the legend height : number of character heights to be added or subtracted to the : region of the legend align : alignment of the text label. Left or right (default) order : order of the keys title : title of the legend sample : format of the sample lines border : border of the legend See L for the available options of border E.g. legend => { position => "outside bottom", width => 3, height => 4, align => "right", order => "horizontal reverse", title => "Title of the legend", sample => { length => 3, position => "left", spacing => 2, }, border => { linetype => 2, width => 1, color => "blue", }, } =head3 timeaxis Specify the axes of which the tic labels are date/time string. Possible values are combinations of "x", "y", "x2", and "y2" joined by ",". E.g. timeaxis => "x, y2" means that the x-axis and y2-axis are data/time axes. =head3 border Border of the graph. Properties supported are: sides : sides on which border is displayed linetype : line type width : line width color : line coler E.g. border => { sides => "bottom, left", linetype => 3, width => 2, color => '#ff00ff', } C tells which side(s) will be displayed. Default is all four borders for 2D plots, and four bottom and left vertial borders for 3D plots. Acceptable valurs are the 12-bit code (see the Gnuplot manual) or the following names: bottom left top right bottom left front bottom left back bottom right front bottom right back left vertical right vertical front vertical back vertical top left front top left back top right front top right back If you set this to C. E.g., border => undef Then this option will be explicitly I and the chart will have not have any border. =head3 grid Major grid lines. E.g. grid => { linetype => 'dash', width => 2, .... } Supported properties are: linetype : line type of the grid lines (default: dot) width : line width (defaulr: 0) color : line color (default: black) xlines : whether the vertical grid lines are drawn (on/off) ylines : whether the horizontal grid lines are drawn (on/off) =head3 tmargin, bmargin Top and bottom margin (in character height). This option has no effect in 3D plots. E.g. tmargin => 10 =head3 lmargin, rmargin Left amd right margin (in character width). This option has no effect in 3D plots. See L. =head3 orient Orientation of the image. Possible values are "lanscape" (default) and "portrait". E.g. orient => "portrait" =head3 imagesize Size (length and height) of the image relative to the default. E.g. imagesize => "0.8, 0.5" =head3 size Size of the plot relative to the chart size. This is useful in some multi-plot such as inset chart. E.g. size => "0.5, 0.4" =head3 origin Origin of the chart. This is useful in some multi-plot such as inset chart. E.g. origin => "0.1, 0.5" =head3 timestamp Time stamp of the plot. To place the time stamp with default setting, timestamp => 'on' Properties of the time stamp (such as date-time format) can also be set, e.g. timestamp => { fmt => '%d/%m/%y %H:%M', offset => "10,-3", font => "Helvetica", } Supported properties are: fmt : date-time format offset : offset relative to the default position font : font face (and optionally font size) =head3 bg Background color of the chart. This option has no effect in the sub-chart of multiplot. E.g. to give the chart a yellow background, bg => "yellow" Properties can be specified in hash. E.g., bg => { color => "yellow", density => 0.2, } Supported properties are: color : color (name ot RRGGBB value) density : density of the coloring =head3 plotbg Background color of the plot area. This option has no effect in 3D plots. See L for supported properties. =head3 gnuplot The path of Gnuplot executable. This option is useful if you are using Windows or have multiple versions of Gnuplot installed. E.g., gnuplot => "C:\Program Files\...\gnuplot\bin\wgnuplot.exe" # for Windows =head3 convert The path of convert executable of ImageMagick. This option is useful if you have multiple convert executables. =head3 terminal The terminal driver that Gnuplot uses. E.g., terminal => 'svg mousing' The default value is C. Terminal is not necessarily related to the output image format. E.g., you may use gif terminal and then convert the image format to jpg by the L method. =head2 Chart Options Not Mentioned Above If Chart::Gnuplot encounters options not mentions above, it would convert them to Gnuplot set statements. E.g. if the chart object is $chart = Chart::Gnuplot->new( ... foo => "FOO", ); the generated Gnuplot statements would be: ... set foo FOO This mechanism lets Chart::Gnuplot support many features not mentioned above (such as "cbrange", "samples", "view" and so on). =head2 Chart Methods =head3 new my $chart = Chart::Gnuplot->new(%options); Constructor of the chart object. If no option is specified, default values would be used. See L for available options. =head3 set General set methods for arbitrary number of options. $chart->set(%options); E.g. $chart->set(view => '30,60'); will be translated to the Gnuplot statement set view 30,60 =head3 plot2d $chart->plot2d(@dataSets); Plot the data sets in a 2D chart. Each dataset is represented by a dataset object. =head3 plot3d $chert->plot3d(@dataSets); Plot the data sets in a 3D chart. Each dataset is represented by a dataset object. =head3 multiplot $chart->multiplot(@charts); Plot multiple charts in the same image. =head3 animate Create animated gif. E.g. # Create (main) chart object my $chart = Chart::Gnuplot->new( output => "animate.gif", ); # Add frames to the (main) chart object my $T = 30; # number of frames my @c; for (my $i = 0; $i < $T; $i++) { $c[$i] = Chart::Gnuplot->new(xlabel => 'x'); my $ds = Chart::Gnuplot::DataSet->new( func => "sin($i*2*pi/$T + x)", ); $c[$i]->add2d($ds); } # Create animation $chart->animate( charts => \@c, delay => 10, # delay 0.1 sec between successive images ); Supported properties are: charts : chart sequence used to create the animation delay : delay (in units of 0.01 second) between successive images, default : value is 5 See L and L. =head3 add2d Add a 2D dataset to a chart without plotting it out immediately. Used with C or C. =head3 add3d Add a 3D dataset to a chart without plotting it out immediately. Used with C or C. =head3 label Add an arbitrary text label. e.g., $chart->label( text => "This is a label", position => "0.2, 3 left", offset => "2,2", rotate => 45, font => "arial, 15", fontcolor => "dark-blue", pointtype => 3, pointsize => 5, pointcolor => "blue", ); Supported properties are: text : label text position : position of the label offset : offset relative to the default position rotate : rotation in degrees font : font face (and optionally font size) fontcolor : color of the text pointtype : point type pointsize : point size pointcolor : point color =head3 arrow Draw arbitrary arrow. e.g., $chart->arrow( from => "0,2", to => "0.3,0.1", linetype => 'dash', width => 2, color => "dark-blue", head => { size => 2, angle => 30, }, ); Supported properties are: from : starting position to : ending position (position of the arrow head) rto : ending position relative to the starting position linetype : line type width : line width color : color head : arrow head Supported properties of the arrow head are: size : size of the head angle : angle (in degree) between the arrow and the head branch direction : head direction ('back', 'both' or 'off') =head3 line Draw arbitrary straight line. e.g., $chart->line( from => "0,2", to => "0.3,0.1", linetype => 'dash', width => 2, color => "dark-blue", ); Supported properties are: from : starting position to : ending position (position of the arrow head) rto : ending position relative to the starting position linetype : line type width : line width color : color =head3 rectangle Draw arbitrary rectangle. e.g., $chart->rectangle( from => "screen 0.2, screen 0.2", to => "screen 0.4, screen 0.4", fill => { density => 0.2, color => "#11ff11", }, border => {color => "blue"}, linewidth => 3, layer => 'front', index => 1, ); Most properties of a rectangle can be classified into location, dimension, filling and border. Location and dimension of the rectangle can be specified by C and C, or C and C, or C, C and C. Filling can be specified by C and C, or C. Border has only one property C so far. Besides, C controls the line width of the border as well as the filling pattern. The layer that the rectangle is drawn is set by C. The C is a tag of the rectangle, which usually can be omitted. =head3 ellipse Draw arbitrary ellipse. e.g., $chart->ellipse( at => "screen 0.2, screen 0.2", width => 0.2, height => 0.5 fill => {pattern => 2}, border => {color => "blue"}, ); The properties of C is the same as those of L, except that its location and dimension must be set by C, C and C. =head3 circle Draw arbitrary circle. e.g., $chart->circle( at => "screen 0.2, screen 0.2", size => 0.5 fill => {pattern => 2}, layer => 'behind', ); The properties of C is the same as those of L, except that its location and dimension must be set by C, C and C. =head3 polygon Draw arbitrary polygon. e.g., $chart->polygon( vertices => [ " 0, 0.2", "-2, -0.2", {to => "2, -0.3"}, {rto => "0, 0.3"}, ], fill => {pattern => 2}, border => {color => "blue"}, ); The location and dimension of the polygon are specified by an array of C. Except C, C of C, C and C, other properties of rectangle is not supported. =head3 copy Copy the chart object. This method is especially useful when you want to copy a chart with highly customized format. E.g. my $chart = Chart::Gnuplot->new( ... ); # $copy is a copy of $chart my $copy = $chart->copy; You may also make multiple copies . E.g. my @copies = $chart->copy(10); # make 10 copies =head3 convert Convert the image format by ImageMagick, e.g. $chart->convert('png'); =head3 png $chart->png; Change the image format to PNG. =head3 gif $chart->gif; Change the image format to GIF. =head3 jpg $chart->jpg; Change the image format to JPEG. =head3 ps $chart->ps; Change the image format to postscript. =head3 pdf $chart->pdf Change the image format to PDF. =head3 command $chart->command($gnuplotCommand); Add a gnuplot command. This method is useful for the Gnuplot features that have not yet implemented. $chart->command(\@gnuplotCommands); Add a list of gnuplot commands. =head3 execute Execute Gnuplot. Normally users do not need to call this method directly because this method would be called automatically by other methods such as L, L and L. =head1 DATASET OBJECT The dataset object can be initiated by the C method. Properties of the dataset may be specified optionally when the object is initiated: my $dataset = Chart::Gnuplot::DataSet->new(%options); The data source of the dataset can be specified by either one of the following ways: =over =item 1. Arrays of x values, y values and z values (in 3D plots) of the data points. =item 2. Array of data points. Each point is specified as an array of x, y, z coordinates =item 3. Data file. =item 4. Mathematical expression (for a function). =back =head2 Dataset Options =head3 xdata, ydata, zdata The x, y, z values of the data points. E.g. xdata => \@x If C is omitted but C is defined, the integer index starting from 0 would be used for C. =head3 points Data point matrix of the format [[x1,y1], [x2,y2], [x3,y3], ...] points => \@points =head3 datafile Input data file datafile => $file The data files are assumed to be space-separated, with each row corresponding to one data point. Lines beginning with "#" are considered as comments and would be ignored. Other formats are not supported at this moment. =head3 func Mathematical function to be plotted. E.g. func => "sin(x)*x**3" Supported functions: abs(x) : absolute value acos(x) : inverse cosine acosh(x) : inverse hyperbolic cosine arg(x) : complex argument asin(x) : inverse sine asinh(x) : inverse hyperbolic sine atan(x) : inverse tangent atanh(x) : inverse hyperbolic tangent besj0(x) : zeroth order Bessel function of the first kind besj1(x) : first order Bessel function of the first kind besy0(x) : zeroth order Bessel function of the second kind besy1(x) : first order Bessel function of the second kind ceil(x) : ceiling function cos(x) : cosine cosh(x) : hyperbolic cosine erf(x) : error function erfc(x) : complementary error function exp(x) : expontial function floor(x) : floor function gamma(x) : gamma function ibeta(a,b,x) : incomplete beta function inverf(x) : inverse error function igamma(a,x) : incomplete gamma function imag(x) : imaginary part invnorm(x) : inverse normal distribution function int(x) : integer part lambertw(x) : Lambert W function lgamma(x) : log gamma function log(x) : natural logarithm log10(x) : common logarithm norm(x) : normal distribution function rand(x) : pseudo random number real(x) : real part sgn(x) : sign function sin(x) : sine sinh(x) : hyperbolic sine sqrt(x) : square root tan(x) : tangent tanh(x) : hyperbolic tangent Please see the Gnuplot manual for updated information. Supported mathematical constants: pi : the circular constant 3.14159... Supported arithmetic operators: addition : + division : / exponentiation : ** factorial : ! modulo : % multiplication : * subtraction : -, e.g., 1-2 unary minus : -, e.g., -1 Supported logical operations: and : && complement : ~ equality : == greater than : > greater than or equal to : >= inequality : != less than : < less than or equal to : <= negation : ! or : || if ... than else ... : ?:, e.g., a ? b : c Parametric functions may be represented as hash. E.g. func => {x => 'sin(t)', y => 'cos(t)'} will draw a circle. =head3 title Title of the dataset (shown in the legend). =head3 style The plotting style for the dataset, including lines : join adjacent points by straight lines points : mark each points by a symbol linespoints : both "lines" and "points" dots : dot each points. Useful for large datasets impluses : draw a vertical line from the x-axis to each point steps : join adjacent points by steps boxes : draw a centered box from the x-axis to each point xerrorbars : "dots" with horizontal error bars yerrorbars : "dots" with vertical error bars xyerrorbars : both "xerrorbars" and "yerrorbars" xerrorlines : "linespoints" with horizontal error bars yerrorlines : "linespoints" with vertical error bars xyerrorlines : both "xerrorlines" and "yerrorlines" boxerrorbars : "boxes" with "yerrorbars" boxxyerrorbars : use rectangles to represent the data with errors financebars : finance bars for open, high, low and close price candlesticks : candle sticks for open, high, low and close price hbars : horizontal bars (experimental) hlines : horizontal lines (experimental) vectors : arrows circles : circles, for say, bubble charts histograms : for plotting histograms C and C are available only if the data is input from C or C<(x,y)data>. =head3 color Color of the dataset in the plot. Can be a named color or RBG (#RRGGBB) value. The supported color names can be found in the file F in the distribution. E.g. color => "#99ccff" is equivalent to color => "dark-red" =head3 width Line width used in the plot. The default width is 1. =head3 linetype Line type. Can be an integer or line type name. The supported line type names can be found in the file F in the distribution. E.g. linetype => 3 is equivalent to linetype => 'dash' Note: the line type may not be displayed as the name if C is set and is not postscript. =head3 pointtype Point type. Can be an integer or point type name. The supported point type names can be found in the file F in the distribution. E.g. pointtype => 64 is equivalent to pointtype => 'square' Note: the point type may not be displayed as the name if C is set and is not postscript. =head3 pointsize Point size of the plot. E.g. pointsize => 3 The default point size is 1. =head3 fill Filling the boxes. Has effect only on plotting styles with boxes, such as "boxes", "boxxyerrorbars" and "financebars". To fill with pattern, fill => { pattern => 1, } C may be an interger from 0 (no filling) to 7. To fill with solid, fill => { color => '#33bb33', density => 0.2, } C may be named color or RGB (#RRGGBB). C may be a real number from 0 (empty) to 1. =head3 border Border of the boxes. Has effect only on plotting styles with boxes and if C is set. C (either named color or RGB) is the only supported property. E.g. border => { color => 'blue', } =head3 axes Axes used in the plot. Possible values are "x1y1", "x1y2", "x2y1" and "x2y2". =head3 timefmt Time format of the input data. The valid format are: %d : day of the month, 1-31 %m : month of the year, 1-12 %y : year, 2-digit, 0-99 %Y : year, 4-digit %j : day of the year, 1-365 %H : hour, 0-24 %M : minute, 0-60 %s : seconds since the Unix epoch (1970-01-01 00:00 UTC) %S : second, 0-60 %b : name of the month, 3-character abbreviation %B : name of the month =head3 smooth The smooth method used in plotting data points. Supported methods include cubic splines (csplines), Bezier curve (bezier) and other. Please see Gnuplot manual for details. =head3 using The C keyword of Gnuplot. =head3 every The C keyword of Gnuplot. Has effect only if the data is input from C. =head3 index The C keyword of Gnuplot. Has effect only if the data is input from C. =head2 Dataset Methods =head3 new my $dataset = Chart::Gnuplot::DataSet->new(%options); Constructor of the dataset object. If no option is specified, default values would be used. See L for available options. =head3 copy Copy the dataset object. This method is especially useful when you want to copy a dataset with highly customized format. E.g. my $dataset = Chart::Gnuplot::DataSet->new( ... ); # $copy and $dataset will have the same format and contain the same data my $copy = $dataset->copy; You may also make multiple copies . E.g. my @copies = $dataset->copy(10); # make 10 copies =head1 EXAMPLES Some simple examples are shown below. Many more come with the distribution. =over =item 1. Plot a mathematical expression my $chart = Chart::Gnuplot->new( output => "expression.png" ); my $dataSet = Chart::Gnuplot::DataSet->new( func => "sin(x)" ); $chart->plot2d($dataSet); =item 2. Plot from two Perl arrays, one for the x-axis data and the other the y-axis. my $chart = Chart::Gnuplot->new( output => "arrays.png" ); my $dataSet = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@y, ); $chart->plot2d($dataSet); =item 3. Plot x-y pairs # Data my @xy = ( [1.1, -3], [1.2, -2], [3.5, 0], ... ); my $chart = Chart::Gnuplot->new( output => "points.png" ); my $dataSet = Chart::Gnuplot::DataSet->new( points => \@xy ); $chart->plot2d($dataSet); =item 4. Plot data from a data file my $chart = Chart::Gnuplot->new( output => "file.png" ); my $dataSet = Chart::Gnuplot::DataSet->new( datafile => "in.dat" ); $chart->plot2d($dataSet); =item 5. Chart title, axis label and legend # Chart object my $chart = Chart::Gnuplot->new( output => "trigonometric.gif", title => "Three basic trigonometric functions", xlabel => "angle in radian", ylabel => "function value" ); # Data set objects my $sine = Chart::Gnuplot::DataSet->new( func => "sin(x)", title => "sine function" ); my $cosine = Chart::Gnuplot::DataSet->new( func => "cos(x)", title => "cosine function" ); my $tangent = Chart::Gnuplot::DataSet->new( func => "tan(x)", title => "tangent function" ); $chart->plot2d($sine, $cosine, $tangent); =item 6. Title in non-English characters (Thanks to WOLfgang Schricker) use Encode; my $title = ... # Title with German umlauts $title = decode("utf8", $title); Chart::Gnuplot->new( encoding => 'iso-8859-1', title => $title, ); =item 7. Plot a financial time series my $chart = Chart::Gnuplot->new( output => "dj.ps", title => "Dow-Jones Index time series", timeaxis => 'x', xtics => { labelfmt => '%b%y', }, ); my $dow = Chart::Gnuplot::DataSet->new( file => "dj.dat", timefmt => '%Y-%m-%d', # time format of the input data style => "candlesticks", grid => 'on', ); $chart->plot2d($dow); =item 8. Plot several graphs on the same image my $chart = Chart::Gnuplot->new( output => "multiplot.gif", ); my $left = Chart::Gnuplot->new(); my $sine = Chart::Gnuplot::DataSet->new( func => "sin(x)", ); $left->add2d($sine); my $center = Chart::Gnuplot->new(); my $cosine = Chart::Gnuplot::DataSet->new( func => "cos(x)", ); $center->add2d($cosine); my $right = Chart::Gnuplot->new(); my $tangent = Chart::Gnuplot::DataSet->new( func => "tan(x)", ); $right->add2d($tangent); # Place the Chart::Gnuplot objects in matrix to indicate their locations $chart->multiplot([ [$left, $center, $right] ]); =back =head1 WISH LIST =over =item 1. Improve the manual. =item 2. Add curve fitting method. =item 3. Improve the testsuite. =item 4. Reduce number of temporary files generated. =back =head1 REQUIREMENTS L, L, L, L Gnuplot L ImageMagick L (for full feature) =head1 SEE ALSO Gnuplot official website L =head1 AUTHOR Ka-Wai Mak =head1 COPYRIGHT Copyright (c) 2008-2011, 2013-2015 Ka-Wai Mak. All rights reserved. =head1 LICENSE This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Chart-Gnuplot-0.23/lib/Chart/Gnuplot/���������������������������������������������������������������0000755�0003772�0003772�00000000000�12471026131�016403� 5����������������������������������������������������������������������������������������������������ustar �kwmak���������������������������kwmak������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Chart-Gnuplot-0.23/lib/Chart/Gnuplot/Util.pm��������������������������������������������������������0000644�0003772�0003772�00000007340�12133030766�017666� 0����������������������������������������������������������������������������������������������������ustar �kwmak���������������������������kwmak������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Chart::Gnuplot::Util; use strict; use vars qw(@ISA @EXPORT_OK); use Exporter; @ISA = qw(Exporter); @EXPORT_OK = qw(_lineType _pointType _borderCode _fillStyle _copy); # Convert named line type to indexed line type of gnuplot # # XXX # Assuming postscript terminal is used # This may subjected to change when postscript/gnuplot changes its convention sub _lineType { my ($type) = @_; return($type) if ($type =~ /^\d+$/); # Indexed line type of postscript terminal of gnuplot my %type = ( solid => 1, longdash => 2, dash => 3, dot => 4, 'dot-longdash' => 5, 'dot-dash' => 6, '2dash' => 7, '2dot-dash' => 8, '4dash' => 9, ); return($type{$type}); } # Convert named line type to indexed line type of gnuplot # # XXX # Assuming postscript terminal is used # This may subjected to change when postscript/gnuplot changes its convention sub _pointType { my ($type) = @_; return($type) if ($type =~ /^\d+$/); # Indexed line type of postscript terminal of gnuplot my %type = ( dot => 0, plus => 1, cross => 2, star => 3, 'dot-square' => 4, 'dot-circle' => 6, 'dot-triangle' => 8, 'dot-diamond' => 12, 'dot-pentagon' => 14, 'fill-square' => 5, 'fill-circle' => 7, 'fill-triangle' => 9, 'fill-diamond' => 13, 'fill-pentagon' => 15, square => 64, circle => 65, triangle => 66, diamond => 68, pentagon => 69, 'opaque-square' => 70, 'opaque-circle' => 71, 'opaque-triangle' => 72, 'opaque-diamond' => 74, 'opaque-pentagon' => 75, ); return($type{$type}); } # Encode the border name # - Used by setting graph border display sub _borderCode { my ($side) = @_; return($side) if ($side =~ /^\d+$/); my $code = 0; $code += 1 if ($side =~ /(^|,)\s*(1|bottom|bottom left front)\s*(,|$)/); $code += 2 if ($side =~ /(^|,)\s*(2|left|bottom left back)\s*(,|$)/); $code += 4 if ($side =~ /(^|,)\s*(4|top|bottom right front)\s*(,|$)/); $code += 8 if ($side =~ /(^|,)\s*(8|right|bottom right back)\s*(,|$)/); $code += 16 if ($side =~ /(^|,)\s*(16|left vertical)\s*(,|$)/); $code += 32 if ($side =~ /(^|,)\s*(32|back vertical)\s*(,|$)/); $code += 64 if ($side =~ /(^|,)\s*(64|right vertical)\s*(,|$)/); $code += 128 if ($side =~ /(^|,)\s*(128|front vertical)\s*(,|$)/); $code += 256 if ($side =~ /(^|,)\s*(256|top left back)\s*(,|$)/); $code += 512 if ($side =~ /(^|,)\s*(512|top right back)\s*(,|$)/); $code += 1024 if ($side =~ /(^|,)\s*(1024|top left front)\s*(,|$)/); $code += 2048 if ($side =~ /(^|,)\s*(2048|top right front)\s*(,|$)/); return($code); } # Generate box filling style string # - called by _thaw() and _setObjOpt() sub _fillStyle { my ($fill) = @_; if (ref($fill) eq 'HASH') { my $style = ""; if (defined $$fill{pattern}) { $style .= " transparent" if (defined $$fill{alpha} && $$fill{alpha} == 0); $style .= " pattern $$fill{pattern}"; } else { if (defined $$fill{alpha}) { $style .= " transparent solid $$fill{alpha}"; } elsif (defined $$fill{density}) { $style .= " solid $$fill{density}"; } else { $style .= " solid 1"; } } $style .= " noborder" if (defined $$fill{border} && $$fill{border} =~ /^(off|no)$/); return($style); } return(" $fill"); } # Copy object using dclone() of Storable sub _copy { my ($obj, $num) = @_; use Storable; my @clones = (); $num = 1 if (!defined $num); for (my $i = 0; $i < $num; $i++) { push(@clones, Storable::dclone($obj)); } return(@clones); } 1; __END__ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������