Silverfrost Logo About Us | Contact Us
 

Native graph plotting

The option [native] is available with %PL for 32-bit applications. It may also be used for 64-bit applications where it becomes the default. The graph plotting for native %PL is provided by ClearWin+ and does not use the external 32-bit SIMPLEPLOT library/DLL.

This is a beta version of the native %PL. Details in the displayed image may change in later releases.

The only limitation of native %PL is that the option [user_drawn] and logarithmic scales are not available. However, the user is able to draw directly to a native %PL graph as outlined below.

The native %PL uses the same "drawing surface" as %GR and automatically uses the smoothing features of GDI+. This results in new options that allow graphs to be drawn using such features as anti-aliasing.

A native %PL inherits...

   a) the current font from %FN;
  b) the font style from %IT etc.;
  c) the font size from %TS;
  d) the text colour from %TC; and
  e) the background colour from %`BG.

A title is drawn using the current font size. The x and y captions use a slightly reduced font size, whilst the numbers at the tick marks are reduced a little further.

The style options [style=0] (link data points with lines) and [style=1] (draw box symbols at data points) are still provided but new options "link" and "symbol" are preferred...

    [link=none]   Don't join data points.
   [link=lines]  Join data points with straight lines (the default).
   [link=curves] Join data points with curves.
   [symbol=0]    Don't draw symbols at data points (the default).
   [symbol=1]    Draw boxes.
   [symbol=2]    Draw triangles.
   [symbol=3]    Draw up-side-down triangles.
   [symbol=4]    Draw rhombuses.
   [symbol=5]    Symbols 2 and 3 together.
   [symbol=6]    Draw filled boxes.
   [symbol=7]    Draw filled triangles.
   [symbol=8]    Draw filled up-side-down triangles.
   [symbol=9]    Draw filled rhombuses.
   [symbol=10]   Draw circles.
   [symbol=11]   Draw discs.
    

Native options that are set once for each %PL (d represents a decimal digit, fval is a floating point number).

[native]] Uses ClearWin+ rather than the SIMPLEPLOT DLL.
[width=d] Specifies the line width (default 1).
[symbol_size=d] Specifies the size of symbols (default 8x8).
[smoothing=d] Specifies the smoothing mode,where d is in the range 0 to 5 .
(default 0, 4 and 5 provide for anti-aliasing).
[dx=fval] Specifies the preferred interval between x tick marks.
[dy=fval] Specifies the preferred interval between y tick marks.
dx and dy are only for linear scales and will not always be adopted.
[x_sigfigs=d] Specifies the number of significant figures to use when drawing the numbers at the x tick marks.
[y_sigfigs=d] Specifies the number of significant figures to use when drawing the numbers at the y tick marks.
(default 6).x_sigfigs and y_sigfigs are particularly useful when using logarithmic scales,
where it can be better to use a value as low as 2.
[independent] Specifies that x-data values differ from one graph to the next. See below.
[framed] Adds a box with tick marks as a frame.
[x_max=fval] Specifies the maximum x data value.
[x_min=fval] Specifies the minimum x data value.

The option [independent] provides for independent x-data for each graph. In this case the number of data points and the optional x-start and x-increment data must be presented as variables (for one graph) or as arrays (for one or more graphs) where the array index corresponds to the order in which the graphs are coded. As a result, these values can be changed after a window has been formed.

Native options that are set for each graph in turn.

[pen_style=d]] Sets the dash style for each line in turn (default zero. These are the Microsoft constants PS_SOLID etc.).
[link=...] See above.
[symbol=d] See above.
 

In native mode, %^PL can be used to provide a callback function that will be called after ClearWin+ has drawn the graph(s). This will occur initially and (if %PV is used) when the window is resized. The callback function can draw directly to the graph by using %GR drawing routines such as DRAW_CHARACTERS@.

The options list for %PL can become quite long. A routine WINOP@ is provided so that the options can be preloaded one or more at a time. For example:

  call winop@("%pl[native,title=Graph]")
  call winop@("%pl[style=0,x_array]")
  i = winio@('%pl&',400,250,N,x,y)
  ... 

The drawing of a graph can be delayed in one of three alternative ways:

   1) By setting all of the y-data values to zero.

   2) By setting [link=none] and using the default [symbol=0].

   3) By providing the number of data points as a variable and setting it initially to zero.

Correspondingly when the graph is required to be drawn,

   1) set the corresonding y-data values, or

   2) change the "link" value (see below), or

   3) change the number of data points

and then call SIMPLEPLOT_REDRAW@().

 

The following functions can be called after a window has been formed in order to change the data.

      INTEGER FUNCTION CHANGE_PLOT_INT@(id, option, index, dval)
      INTEGER FUNCTION CHANGE_PLOT_DBL@(id, option, index, fval)
      INTEGER FUNCTION CHANGE_PLOT_CHR@(id, option, index, sval)
      INTEGER id,index,dval
      CHARACTER*(*) option, sval
      REAL*8 fval
        

id is the indentifier used with %`PL and select_graphics_object@. If there is only one active object then id can be set to zero.
index corresponds to the number of the graph (starting at 1). Set this to zero when the dval/fval/sval applies to all graphs.
dval, fval and sval represent the value to be changed. In two cases this will be an array.
option usually mirrors one of the %PL options and is one of:

          "x_min"     fval - for all graphs
          "x_max"     fval - for all graphs
          "y_min"     fval - for all graphs
          "y_max"     fval - for all graphs
          "dx"        fval - for all graphs
          "dy"        fval - for all graphs
          "x_axis"    sval - for all graphs
          "y_axis"    sval - for all graphs  
          "title"     sval - for all graphs
          "color"
          "colour"    dval - for each graph in turn
          "pen_style" dval - for each graph in turn
          "symbol"    dval - for each graph in turn
          "link"      dval - for each graph in turn (0=none, 1=lines, 2=curves)
          "x_data"    fval x-data array which varies from one graph to the next when [independent]
          "y_data"    fval y-data array for each graph int turn

The functions return zero on success or a non-zero error code. CLEARWIN_STRING@("ERROR_REPORT") describes the cause of a failure.

The routine CLEARWIN_OPTION@ can be called in order to change the way that these errors are reported...

          CLEARWIN_OPTION@("hide_error")  ClearWin+ does not generate a direct message. This is the default.
          CLEARWIN_OPTION@("show_error")  ClearWin+ reports an error in a "message box" and continues.
          CLEARWIN_OPTION@("fatal_error") ClearWin+ reports an error in a dialog box together with a trace back and exits.   

The following routine can be called from within a %PL callback function in order to get the pixel coordinates of a particular point relative to the axes.

            SUBROUTINE GET_PLOT_POINT@(x,y,xpix,ypix)
            REAL*8 x,y           (input values)
            REAL*8 xpix,ypix     (output values) 

The function returns zero on success or a non-zero error code.

      

Additional notes

1. If ClearWin+ draws a title or axis caption at an inappropriate point then its position can be adjusted. For example [title=My Graph@(4.8)] using a decimal point, draws "My Graph" at a point that is adjusted 4 pixels to the right and 8 pixels down from its default position.

2. If an axis caption is not supplied then the defaults are lower case "x" and "y". Setting [x-axis=@] or [y-axis=@] prevents ClearWin+ from drawing the caption which could then be drawn using a callback function.

3. %`PL provides for a user indentifier for the %PL control that can be used in a call to SELECT_GRAPHIC_OBJECT@ but this call is not needed within a %^PL callback because the corresponding object will already be selected.

4. Options like y_min, y_max and dy are intended for small adjustments to the results provided by ClearWin+. For example if the range of y was from 1 to 99, then for a better presentation you could set y_min=0.0 and y_max=100.0. Similarly if the tick marks turn out to be at intervals of 11 (say) then you could set dy=10.0.

Here are two sample programs that illustrates many of these features:

      WINAPP 
      USE clrwin 
      INTEGER N,i
      PARAMETER(N=10)
      REAL*8 x(N),y(N)
      DO i=1,N
        x(i)=0.1d0*(i-1)
        y(i)=x(i)*x(i)
      ENDDO
      i=winio@('%ca[Quadratic]%pv&')
      i=winio@('%`bg[white]&')
      CALL winop@("%pl[title=Graph]")
      CALL winop@("%pl[width=2]")
      CALL winop@("%pl[y_max=0.9]")
      CALL winop@("%pl[x_array]")
      CALL winop@("%pl[link=curves]")
      CALL winop@("%pl[symbol=9]")
      CALL winop@("%pl[colour=red]")
      CALL winop@("%pl[pen_style=2]")
      i=winio@('%pl&',400,250,N,x,y)
      i=winio@('%sf%ff%nl%cn%tt[OK]')
      END
  

      WINAPP
      MODULE mydata
        USE clrwin
        ENUM,BIND(C)
         ENUMERATOR::link_none=0,link_lines,link_curves !values 0,1,2
         ENUMERATOR::all_graphs=0,graph1                !values 0,1
        END ENUM 
        INTEGER,PARAMETER::n=1000
        LOGICAL shown
        DOUBLE PRECISION y(n)
      CONTAINS
      INTEGER FUNCTION show()
        INTEGER errstate
        errstate = change_plot_int@(0,"link",graph1,link_curves)
        if(errstate /= 0) print*, clearwin_string@("ERROR_REPORT")
        errstate = change_plot_int@(0,"colour",graph1,RGB@(255,0,0))
        errstate = change_plot_dbl@(0,"y_max",all_graphs,1.5d0)
        shown = .true.
        CALL simpleplot_redraw@()
        show = 2
      END FUNCTION show
      INTEGER FUNCTION clear()
        INTEGER errstate
        errstate = change_plot_int@(0,"link",graph1,link_none)
        shown = .false.
        CALL simpleplot_redraw@()
        clear = 2
      END FUNCTION clear
      INTEGER FUNCTION legend()
        IF(shown) THEN
          CALL draw_characters@("Legend:..", 300, 100, 0)
          CALL draw_line_between@(300,120,360,120,RGB@(0,0,255))
        ENDIF
        legend = 2
      END FUNCTION legend
      END MODULE mydata
      
      PROGRAM main
      USE mydata
      INTEGER i,x
      DOUBLE PRECISION p1,p2,p3
      p1=1.5d0
      p2=150.0d0
      p3=15d0
      x=0
      DO i=1,n
        y(i)=p1*sin(x/p3)*exp(-x/p2)
        x=x+1
      ENDDO
      shown = .false.
      i=winio@('%ww[no_border]%ca[Damped wave]%pv&')
      i=winio@('%mn[Edit[Show, Clear]]&', show, clear)
      i=winio@('%fn[Tahoma]&')
      i=winio@('%ts&', 1.1d0)
      i=winio@('%tc&',rgb@(0,0,80))
      i=winio@('%it&')
      i=winio@('%`bg&',rgb@(230,255,225))
      CALL winop@("%pl[native]")
      CALL winop@('%pl[title="Sample plot"]')
      CALL winop@("%pl[x_axis=Time(Milliseconds)]")
      CALL winop@("%pl[y_axis=Amplitude@(-4.0)]")
      CALL winop@("%pl[smoothing=4]") ! anti-aliasing
      CALL winop@("%pl[link=none]")   ! delay drawing
      i=winio@("%^pl",500,400,n,0.0d0,1.0d0,y,legend)
      END
  

 

Copyright © 1999-2017 Silverfrost Limited