Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re^2: Create a plot / chart with dates as x-values?

by Anonymous Monk
on Jan 02, 2013 at 17:30 UTC ( [id://1011321]=note: print w/replies, xml ) Need Help??


in reply to Re: Create a plot / chart with dates as x-values?
in thread Create a plot / chart with dates as x-values?

Hm... I've gotten this to sort-of work, but the x-data is not spaced properly (the dates are not all equidistant, but are shown as such on the plot). In fact, the docs say as much:

"First of all: GD::Graph does not support numerical x axis the way it should. Data for X axes should be equally spaced. That understood: There is some support to make the printing of graphs with numerical X axis values a bit better, thanks to Scott Prahl."

Here's the code:

#!/usr/bin/env perl use Modern::Perl; use DateTime; use GD::Graph::points; my @x_vals = ( '2012-11-07', '2012-11-08', '2012-11-15', '2012-11-19', '2012-11-30', ); my @y_vals = ( 11, 12, 13, 14, 15, ); # ------------------------------------------- my @epoch_x_vals = (); for my $d (@x_vals) { my ($y, $m, $d) = split /-/, $d; push @epoch_x_vals, DateTime->new(year => $y, month => $m, day => $d) ->epoch; } my @data = (\@epoch_x_vals, \@y_vals); sub x_number_formatter { my ($e) = @_; my $dt = DateTime->from_epoch(epoch => $e); return $dt->ymd; } my $graph = GD::Graph::points->new(400, 300); $graph->set( x_label => 'X label', x_labels_vertical => 1, x_tick_number => 10, # experimented with this value a bit x_number_format => \&x_number_formatter, y_label => 'Y label', title => 'some title', ) or die $graph->error; my $gd = $graph->plot(\@data) or die $graph->error; open(my $img, '> plot.png') or die $!; binmode $img; print $img $gd->png;

Will do some experimenting with gnuplot to see what I can get.

Replies are listed 'Best First'.
Re^3: Create a plot / chart with dates as x-values?
by BrowserUk (Patriarch) on Jan 02, 2013 at 18:58 UTC

    Maybe this is closer to your liking:

    #! perl -slw use strict; use Time::Local qw[ timelocal ]; use POSIX qw[ strftime ]; use GD::Graph::points; my @x_vals = ( '2012-11-07', '2012-11-08', '2012-11-15', '2012-11-19', '2012-11-30', ); my @y_vals = ( 11, 12, 13, 14, 15, ); # ------------------------------------------- my @epoch_x_vals = map { my( $y, $m, $d ) = split /-/, $_; timelocal( 0,0,0, $d, $m, $y ); } @x_vals; my @data = (\@epoch_x_vals, \@y_vals); sub x_number_formatter { return strftime "%Y-%m-%d", localtime shift; +} my $graph = GD::Graph::points->new(400, 300); $graph->set( x_label => 'X label', x_labels_vertical => 1, x_tick_number => 5, # experimented with this value a bit x_min_value => $epoch_x_vals[ 0 ] - 1e6, x_max_value => $epoch_x_vals[ 4 ] + 1e6, x_number_format => \&x_number_formatter, y_label => 'Y label', title => 'some title', ) or die $graph->error; my $gd = $graph->plot(\@data) or die $graph->error; open(my $img, '> plot.png') or die $!; binmode $img; print $img $gd->png; close $img; system 'plot.png';

    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1011321]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (3)
As of 2024-03-19 04:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found