The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

PostScript::XYChart - graph lines and points

SYNOPSIS

    use PostScript::XYChart;

    # Draw a graph from data in the CSV file 
    # 'results.csv', and saves it as 'results.ps'
    
    my $xy = new PostScript::XYChart();
    $xy->line_from_file( "results.csv", "Results" );
    $xy->build_chart();
    $xy->output("results");

     
     
    # Or with more direct control

    use PostScript::XYChart;
    use PostScript::GraphStyle qw(defaults);

    $PostScript::GraphStyle::defaults{gray} =
        [ [ 1, 1, 0 ],      # yellow
          [ 0, 1, 0 ],      # green
          [ 0, 1, 1 ], ];   # cyan
        
    my $xy = new PostScript::XYChart(
            file  => {
                errors    => 1,
                eps       => 0,
                landscape => 1,
                paper     => 'Letter',
            },
            chart => {
                dots_per_inch => 72,
                heading       => "Example",
                background    => [ 0.9, 0.9, 1 ],
                heavy_color   => [ 0, 0.2, 0.8 ],
                mid_color     => [ 0, 0.5, 1 ],
                light_color   => [ 0.7, 0.8, 1 ],
            },
            x_axis => {
                smallest => 4,
                title    => "Control variable",
                font     => "Courier",
            },
            y_axis => {
                smallest => 3,
                title    => "Dependent variable",
                font     => "Courier",
            },
            style  => {
                auto  => [qw(gray dashes)],
                color => 0,
                line  => {
                    inner_width  => 2,
                    outer_width  => 2.5,
                    outer_dashes => [],
                },
                point => {
                    shape => "circle",
                    size  => 8,
                    color => [ 1, 0, 0 ],
                },
            },
            key    => {
                    background => 0.9,
            },
        );

    $xy->line_from_array(
        [ [ qw(Control First Second Third Fourth),
            qw(Fifth Sixth Seventh Eighth Nineth)],
          [ 1, 0, 1, 2, 3, 4, 5, 6, 7, 8 ],
          [ 2, 1, 2, 3, 4, 5, 6, 7, 8, 9 ],
          [ 3, 2, 3, 4, 5, 6, 7, 8, 9,10 ],
          [ 4, 3, 4, 5, 6, 7, 8, 9,10,11 ], ]
        );
    $xy->build_chart();
    $xy->output("controlled");
   

DESCRIPTION

A graph is drawn on a PostScript file from one or more sets of numeric data. Scales are automatically adjusted for each data set and the style of lines and points varies between them. A title, axis labels and a key are also provided.

CONSTRUCTOR

new( [options] )

options may be either a list of hash keys and values or a hash reference. Either way, the hash should have the same structure - made up of keys to several sub-hashes.

    $xy = new PostScript::XYChart(
                file   => {
                    # for PostScript::File
                    eps => 1,
                },
                chart  => {
                    # for PostScript::GraphPaper
                    title => "My Graph",
                },
                x_axis => {
                    # for PostScript::GraphPaper
                    font => "Courier",
                },
                y_axis => {
                    # for PostScript::GraphPaper
                    rotate => 1,
                },
                style  => {
                    # for PostScript::GraphStyle
                    color => 1,
                },
                key    => {
                    # for PostScript::GraphKey
                    num_items => 5,
                },
            );

All the settings are optional and the defaults work reasonably well. For convenience, the full tree of over 140 options is given below. See the relevant manpage for full details. The most useful ones are marked with (*).

From PostScript::File

    file
        debug
        errors *
        headings
        reencode

        bottom
        clip_command
        clipping
        dir
        eps *
        file
        font_suffix
        height
        landscape *
        left
        paper *
        right
        top
        width
        
        db_active
        db_base
        db_bufsize
        db_color
        db_font
        db_fontsize
        db_xgap
        db_xpos
        db_xtab
        db_ytop

        incpage_handler
        page
        strip

From PostScript::GraphPaper

    chart
        background
        bottom_edge
        color *
        dots_per_inch
        font
        font_color
        font_size
        heading
        heading_font
        heading_font_color
        heading_font_size
        heading_height
        heavy_color
        heavy_width
        key_width
        left_edge
        light_color
        light_width
        mid_color
        mid_width
        right_edge
        right_margin
        spacing
        top_edge
        top_margin

    x_axis
        center
        font
        font_color
        font_size
        height
        high
        label_gap
        labels
        labels_req
        low
        mark_min
        mark_max
        rotate
        smallest *
        title
        width

    y_axis
        (same as x_axis)

From PostScript::GraphStyle

    style
        auto *
        color *
        same *

        line
            color
            dashes
            inner_color
            inner_dashes
            inner_width
            outer_color
            outer_dashes
            outer_width
            width
        
        point
            color
            inner_color
            inner_width
            outer_color
            outer_width
            shape
            size
            width
                
        bar
            color
            inner_color
            inner_width
            outer_color
            outer_width
            width
        

From PostScript::GraphKey

    key
        file
        background
        graph_paper
        horizontal_spacing
        icon_height
        icon_width
        max_height
        num_items
        outline_color
        outline_width
        spacing *
        text_color
        text_font
        text_size
        text_width
        title
        title_color
        title_font
        title_size
        vertical_spacing

OBJECT METHODS

line_from_array( data [, label|opts|style ]... )

data

An array reference pointing to a list of positions.

label

A string to represent this line in the Key.

opts

This should be a hash reference containing keys and values suitable for a PostScript::GraphStyle object. If present, the object is created with the options specified.

style

It is also acceptable to create a PostScript::GraphStyle object independently and pass that in here.

One or more lines of data is added to the chart. This may be called many times before the chart is finalized with build_chart.

Each position is the data array contains an x value and one or more y values. For example, the following points will be plotted on an x axis from 2 to 4 a y axis including from 49 to 57.

    [ [ 2, 49.7 ],
      [ 3, 53.4 ],
      [ 4. 56.1 ], ]

This will plot three lines with 6 points each.

    [ ["X", "Y", "Yb", "Yc"],
      [x0, y0, yb0, yc0],
      [x1, y1, yb1, yc1],
      [x2, y2, yb2, yc2],
      [x3, y3, yb3, yc3],
      [x4, y4, yb4, yc4],
      [x5, y5, yb5, yc5], ]

The first line is made up of (x0,y0), (x1,y1)... and these must be there. The second line comes from (x0,yb0), (x1,yp1)... and so on. Optionally, the first row of data in the array may be labels for the X and Y axis, and then for each line.

Where multiple lines are given, it is best to specify label as an option. Otherwise it will default to the name of the first line - rarely what you want. Of course this is ignored if the new option 'y_axis => title' was given.

line_from_file( file [, label|opts|style ]... )

file

The name of a CSV file.

label

A string to represent this line in the Key.

opts

This should be a hash reference containing keys and values suitable for a PostScript::GraphStyle object. If present, the object is created with the options specified.

style

It is also acceptable to create a PostScript::GraphStyle object independently and pass that in here.

The comma seperated file should contain data in the form:

    x0, y0
    x1, y1
    x2, y2

Optionally, the first line may hold labels. Any additional columns are interpreted as y-values for additional lines. For example:

    Volts, R1k2, R1k8, R2k2
    4.0,   3.33, 2.22, 1.81
    4.5,   3.75, 2.50, 2.04
    5.0,   4.16, 2.78, 2.27
    5.5,   4.58, 3.05, 2.50

Where multiple lines are given, it is best to specify label as an option. Otherwise it will default to the name of the first line - rarely what you want. Of course the new option 'y_axis => title' takes precedence over both.

Note that the headings have to begin with a non-digit in order to be recognized as such.

build_chart()

The main method. It calculates the scales from the data collected, draws the graph paper, puts the lines on it and adds a key.

SUPPORTING METHODS

add_function( name, code )

Add functions to the underlying PostScript::File object. See "add_function" in PostScript::File for details.

add_to_page( [page], code )

Add postscript code to the underlying PostScript::File object. See "add_to_page" in PostScript::File for details.

file

Return the underlying PostScript::File object.

graph_key

Return the underlying PostScript::GraphKey object. Only available after a call to build_chart.

graph_paper

Return the underlying PostScript::GraphPaper object. Only available after a call to build_chart.

newpage( [page] )

Start a new page in the underlying PostScript::File object. See "newpage" in PostScript::File and "set_page_label" in PostScript::File.

output( file [, dir] )

Output the chart as a file. See "output" in PostScript::File.