NAME
SVG::Plot - a simple module to take one or more sets of x,y points and
plot them on a plane
SYNOPSIS
use SVG::Plot;
my $points = [[0,1,'
http://uri/'],[2,3,'/uri/foo.png']];
my $plot = SVG::Plot->new(
points => $points,
debug => 0,
scale => 0.025,
max_width => 800,
max_height => 400,
point_size => 3,
point_style => {
fill => 'blue',
stroke => 'yellow'
},
line => 'follow',
margin => 6,
);
# -- or --
$plot->points($points);
$plot->scale(4);
print $plot->plot;
DESCRIPTION
a very simple module which allows you to give one or more sets of points
[x co-ord, y co-ord and optional http uri]) and plot them in SVG.
$plot->points($points) where $points is a reference to an array of array
references.
see new for a list of parameters you can give to the plot. (overriding
the styles on the ponts; sizing a margin; setting a scale; optionally
drawing a line ( line => 'follow' ) between the points in the order they
are specified.
METHODS
new
use SVG::Plot;
# Simple use - single set of points, all in same style.
my $points = [ [0, 1, '
http://uri/'], [2, 3, '/uri/foo.png'] ];
my $plot = SVG::Plot->new(
points => \@points,
point_size => 3,
point_style => {
fill => 'blue',
stroke => 'yellow'},
line => 'follow',
debug => 0,
scale => 0.025,
max_width => 800,
max_height => 400,
margin => 6,
);
# Prepare to plot two sets of points, in distinct styles.
my $pubs = [
[ 522770, 179023, "
http://example.com/?Andover_Arms ],
[ 522909, 178232, "
http://example.com/?Blue Anchor ] ];
my $stations = [
[ 523474, 178483, "
http://example.com/?Hammersmith" ] ];
my $pointsets = [ { points => $pubs,
point_size => 3,
point_style => { fill => "blue" }
},
{ points => $stations,
point_size => 5,
point_style => { fill => "red" }
} ];
my $plot = SVG::Plot->new(
pointsets => $pointsets,
scale => 0.025,
max_width => 800,
max_height => 400
);
you can supply a grid in the format
SVG::Plot->new(
grid => { min_x => 1,
min_y => 2,
max_x => 15,
max_y => 16 }
);
or
$plot->grid($grid)
this is like a viewbox that shifts the boundaries of the plot.
if it's not specified, the module works out the viewbox from the
highest and lowest X and Y co-ordinates in the list(s) of points.
Note that the actual margin will be half of the value set in
"margin", since half of it goes to each side.
If "max_width" and/or "max_height" is set then "scale" will be
reduced if necessary in order to keep the width down.
If "debug" is set to true then debugging information is emitted as
warnings.
If "point_size" is set to "AUTO" then
Algorithm::Points::MinimumDistance will be used to make the point
circles as large as possible without overlapping, within the
constraints of "min_point_size" (which defaults to 1) and
"max_point_size" (which defaults to 10). Note that if you have
multiple pointsets then the point circle sizes will be worked out
*per set*.
All arguments have get_set accessors like so:
$plot->point_size(3);
The "point_size", "point_style" attributes of the SVG::Plot object
will be used as defaults for any pointsets that don't have their own
style set.
plot
print $plot->plot;
"plot" will croak if the object has a "max_width" or "max_height"
attribute that is smaller than its "margin" attribute, since this is
impossible.
NOTES
this is an early draft, released mostly so Kake can use it in OpenGuides
without having non-CPAN dependencies.
for an example of what one should be able to do with this, see
http://space.frot.org/rdf/tubemap.svg ... a better way of making
meta-information between the lines, some kind of matrix drawing; cf the
grubstreet link below, different styles according to locales, sets,
conceptual contexts...
it would be fun to supply access to different plotting algorithms, not
just for the cartesian plane; particularly the buckminster fuller
dymaxion map; cf Geo::Dymaxion, when that gets released
(
http://iconocla.st/hacks/dymax/ )
to see work in progress,
http://un.earth.li/~kake/cgi-bin/plot2.cgi?cat=Pubs&cat=Restaurants&cat=
Tube&colour_diff_this=loc&action=display
BUGS
possibly. this is alpha in terms of functionality, beta in terms of
code; the API won't break backwards, though.
AUTHOR
Jo Walsh (
[email protected] )
Kate L Pugh (
[email protected] )