From WeBWorK_wiki
Revision as of 21:46, 14 February 2008 by Sam (talk | contribs)
Jump to navigation Jump to search

Dynamically Generated Graphs: PG Code Snippet

This code snippet shows the essential PG code to include dynamically generated graphs in a problem. Note that these are insertions, not a complete PG file. This code will have to be incorporated into the problem file on which you are working.

Note that in the following we consider first a very simple example that shows the basics of including a dynamically generated graph, and then, below that, a couple of more complicated examples that demonstrate some of the additional features of the graph macros.

Problem Techniques Index

PG problem file Explanation

In the initialization section of the file we need to load PGgraphmacros.pl. This should generally be loaded before the PGcourse.pl file.

  $gr = init_graph(-1,-1,4,4,axes=>[0,0]);

  "x^2/4 for x in <-1,4> using color:blue and weight:2");

Then, in the problem set-up section of the file, we create a graph object by calling init_graph. Arguments for init_graph are xmin,ymin,xmax,ymax, and then options to modify the characteristics of the graph. In this case the only option that we have specified is to put axes centered on the point (0,0) (the origin) on the graph.

We add functions to all three graphs with add_functions, which takes as arguments the graph and a list of text strings that give the functions to graph. In this case we only add one function, so there's only one string after the graph object. In every case the text string has the same form:

  <i>function</i> for x in <i>range</i> 
    using color:<i>colorname</i> and weight:<i>numericalweight</i>

The function should be given as a function of x, and should be written with * for multiplication. Thus entering 2*sin(x^2) for function will work, but 2sin(t^2) will not, even if the latter uses "for t in" instead of "for x in".

The range specified is given as a mathematical interval: that is, specifying a square bracket ([ or ]) at one end of the interval will result in that point being "included" in the interval by the insertion of a solid circle at the end of the interval; specifying a parenthesis (( or )) will give an open interval, with an open circle at the end of the interval; and, as a special case, using angle brackets (as is done here: < or >) will leave off the open or closed circle entirely.

Finally, colorname and numericalweight are what we would expect: the name of the color to graph the function, and the weight of the curve used. The default weight is two, and the default color is black.

  \{ image( insertGraph($gr) ) \}

Images are included in the text section of the problem with the image command, and insertGraph inserts the dynamically generated graph.

In addition to this basic graph insertion, we can do more interesting things as well: for example, we can specify the size of the image in the hardcopy that a student can print out, the size of the image when viewed on screen, and extra HTML tags to use when displaying the image on the screen. In addition, there are cases where we want to leave off the default graph labeling, which is also easily done. We can decorate images with labels, lines and points as well.

PG problem file Explanation

We include PGgraphmacros.pl, of course.

  $gr1 = init_graph(-1,-1,4,4,axes=>[0,0],grid=>[5,5]);
  $gr2 = init_graph(-1,-1,4,4,axes=>[0,0],size=>[150,150]);


  "sin(x) for x in <-1,4> using color:black and weight:2");

  "2*x for x in in <-1,4> using color:green and weight:2",
  "-x for x in <-1,4> using color:red and weight:2");

To illustrate a couple of different features of dynamically generated graphs, we create two new graph objects in the problem set-up section of the file: $gr1 and $gr2. In either case we specify a couple of options that were omitted in the basic example above.

For the graph object $gr1 we add a grid to the image. The grid is specified with a [xgrid,ygrid] list that indicates the number of grid boxes to place along the x and y axes of the graph. Here the range of values along both axes is five units long, so we include five boxes in either direction.

Then, for the graph object $gr2, we explicitly specify the size of the image, in pixels. The default size for dynamically generated images is 200x200 pixels.

Next, we remove all of the default labels and tick marks from the graph object $gr2 by calling the lb method to reset them: this is the $gr2->lb('reset') line.

And we add functions to all three graphs with add_functions. Note that here we have added two functions to the second graph object.

  \{ image( insertGraph($gr1), tex_size=>250 ) \}
  \{ image( insertGraph($gr2), tex_size=>250,
  height=>150, width=>150, 
  extra_html_tags=>'alt="graph of a green ' .
  'line through the origin into the first and ' .
  'third quadrants and a red line through the ' .
  'origin extending into the second and fourth ' .
  'quadrants."' ) \}

Then, in the text section of the file, we have made a couple of additional changes. The first is the inclusion of the tex_size=>250 option in the image call. This specifies the scaling percent (250 gives 25%) for the graph in a hardcopy.

When inserting graph object $gr2, we specify both the hardcopy scaling and the size to display the image when it is shown on screen. Both of the height and width options give the size in pixels.

Finally, for the image call for $gr2, we have included an extra HTML tag to include when the image is shown on the screen. Using extra_html_tags allows us to include any of the options that could normally be included in an img tag in HTML coding. In this example, we specify an alt attribute that specifies alternate text to include. One reason for this might be to give screen-reading software text to render to explain what graph is being shown.

It's worth making one more note about this option, which has been broken over a couple of lines to avoid having one very long line on this help page. The short version of the option would be:

  extra_html_tags=>'alt="alternate text"'

To break the text over multiple lines in this example, we have used the Perl concatenation operator . (dot: a period). Note that the use of single quotes to enclose the HTML tag that is being included means that if we wanted to include a variable in the text, we'd have to do some additional concatenation. (Variables are not expanded within single quotes.) For example, suppose that we had graphed the function sin($a*x), where $a is a variable that we defined earlier in the PG file. Then we might have the extra_html_tags call below.

  extra_html_tags=>'alt="graph of sin(' .
    $a . 'x)"'

Problem Techniques Index