pricecharts

track prices of consumer electronics
Log | Files | Refs | README

commit 4c4ebd0a6e84263c06926abc4b8f4780bcf72511
parent 927f227b3b2296f9d9641dee9e9223c5ebf6f7e5
Author: Kyle Milz <kyle@getaddrinfo.net>
Date:   Fri, 24 Oct 2014 00:35:14 -0600

site_gen: add x, y axis labels, use viewBox, add circles at data points

Diffstat:
Msite_gen.pl | 52+++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 45 insertions(+), 7 deletions(-)

diff --git a/site_gen.pl b/site_gen.pl @@ -78,11 +78,11 @@ sub gen_chart vprintf("\tdomain: $x_min - $x_max\n"); vprintf("\trange: $y_min - $y_max\n"); - my $svg = SVG->new(width => 800, height => 200); + my $svg = SVG->new(viewBox => "0 0 1000 250"); $query = "select distinct vendor from prices where part_num = ?"; my $vendors = $dbh->selectcol_arrayref($query, undef, $part_num); - vprintf("\tvendors: "); + vprintf("\tvendors: " . scalar @$vendors . "\n"); for (@$vendors) { $query = "select date from prices where " . @@ -96,21 +96,59 @@ sub gen_chart $part_num, $_); vprintf("\tprices found: " . scalar @$prices . "\n"); - my $points = $svg->get_path(x => $dates, y => $prices, - -closed => "false"); + my @xs = map { ($_ - $x_min) / ($x_max - $x_min) * 900 + 30 } @$dates; + my @ys = map { ($_ - $y_min) / ($y_max - $y_min) * 210 + 20 } @$prices; + + my $vendor_color = "#$cfg->{vendors}{$_}{color}"; + + my $i = 0; + for (@xs) { + $svg->circle(cx => $xs[$i], cy => $ys[$i], r => 2, + style => { + 'fill-opacity' => 1, + 'fill' => $vendor_color, + 'stroke' => $vendor_color + } + ); + $i++; + } + my $points = $svg->get_path(x => \@xs, y => \@ys, + -closed => "false"); $svg->path( %$points, id => $_, style => { 'fill-opacity' => 0, - 'fill' => 'green', - 'stroke' => 'rgb(250, 123, 123)' + 'fill' => $vendor_color, + 'stroke' => $vendor_color, + 'stroke-width' => 2, } ); } - $svg->text(id => 'l1', x => 10, y => 30)->cdata($part_num); + for my $i (0..5) { + my $price = $y_max - $i * ($y_max - $y_min) / 5; + my $y = 20 + $i * (210 / 5); + $svg->text(id => $i, x => 950, y => $y, + style => "font-size: 12px; fill: #666", + "text-anchor" => "start")->cdata("\$$price"); + $svg->line(id => "line_$i", x1 => 30, y1 => $y, + x2 => 930, y2 => $y, + "fill" => "#CCC", + "stroke" => "#CCC", + "stroke-width" => 1, + ); + } + + for my $i (0..5) { + my $time = $x_min + $i * ($x_max - $x_min) / 5; + my $date = strftime "%b %e %Y", localtime($time); + my $x = 30 + $i * 900 / 5; + $svg->text(id => $time, x => $x, y => 250, + style => "font-size: 12px; fill: #666", + "text-anchor" => "middle")->cdata($date); + } open my $svg_fh, ">", "$svg_dir/$part_num.svg" or die $!; print $svg_fh $svg->xmlify;