Annotation of loncom/html/adm/help/tex/Authoring_Piecewise_Plot.tex, revision 1.2
1.1 bowersj2 1: \label{Authoring_Piecewise_Plot}
2: Suppose you want to plot a piecewise function similar to the
3: following:
4:
5: \begin{verbatim}
6: f(x) = a*x + b if (x < 4.5)
7: f(x) = a*x if (x >=4.5)
8: \end{verbatim}
9:
10: The following is the XML representation of a problem with a dynamic
11: plot based on this. The work is done in a <script> block that
12: generates the data sets used in the plot.
13:
14: \begin{verbatim}
15: <script type="loncapa/perl" >
16: $a = &random(2,5,1);
17: $b = &random(3,6,1);
18:
19: for ($x = 0; $x<4.5; $x+= 0.05) {
20: push @X, $x;
21: push @Y, $a*$x + $b;
22: }
23:
24: for ($x = 4.5; $x<=10; $x+= 0.05) {
25: push @X, $x;
26: push @Y, $a*$x;
27: }
28: </script >
29: <gnuplot font="medium" width="500" grid="on" height="400" border="on"
30: fgcolor="x000000" alttag="dynamically generated plot" align="center"
31: bgcolor="xffffff" transparent="off" >
32: <curve linestyle="lines" pointsize="1" pointtype="1" color="x000000"
33: name="">
34: <data >@X</data >
35: <data >@Y</data >
36: </curve >
37: </gnuplot >
38: \end{verbatim}
39:
40: The above script works, but it produces a plot like this:
41:
42: \includegraphics{dynamic_piecewise}
43:
1.2 ! albertel 44: A better solution is to use two separate <curve> statements to plot
1.1 bowersj2 45: two separate curves. So on the second piece of the function we use
46: @X2 and @Y2 instead of @X and @Y. Then in the <gnuplot> tag we
47: include a second <curve> sub-tag.
48:
49: \begin{verbatim}
50: <script type="loncapa/perl" >
51: $a = &random(2,5,1);
52: $b = &random(3,6,1);
53:
54: for ($x = 0; $x<4.5; $x+= 0.05) {
55: push @X, $x;
56: push @Y, $a*$x + $b;
57: }
58:
59: for ($x = 4.5; $x<=10; $x+= 0.05) {
60: push @X2, $x;
61: push @Y2, $a*$x;
62: }
63: </script >
64: <gnuplot font="medium" width="500" grid="on" height="400" border="on"
65: fgcolor="x000000" alttag="dynamically generated plot" align="center"
66: bgcolor="xffffff" transparent="off" >
67: <curve linestyle="lines" pointsize="1" pointtype="1" color="x000000"
68: name="" >
69: <data >@X</data >
70: <data >@Y</data >
71: </curve >
72: <curve linestyle="lines" pointsize="1" pointtype="1" color="x000000"
73: name="" >
74: <data >@X2</data >
75: <data >@Y2</data >
76: </curve >
77: </gnuplot >
78: \end{verbatim}
79:
80: \includegraphics{dynamic_piecewise2}
81:
82: This is still not a desirable result. Typically one wants an open
83: circle or closed circle defining the domain of each
84: piece. Unfortunately there is no easy way to do this in gnuplot
85: currently. If this effect is desired, perhaps using a static image
86: and a randomlabel problem would be a better approach. A second
87: solution would be to add data which draws a circle to your curves.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>