From: Davide C. <dc...@ar...> - 2008-09-25 14:21:13
|
Dear plplot subscribers, I would like to repeatedly enable/disable viewport clipping while plotting, in order to draw lines, symbols, etc. in a legend outside the plot, while retaining clipping when data is plotted. Is there a simple way to do this in plplot, or is clipping-disable in the TODO list? Up to now i found a suboptimal solution (see fortran subroutine further in text) by calling plgvpd/plgvpw to get viewport/window settings, setting viewport to [0.,1.],[0.,1.] and enlarging correspondingly the plotting window, then switching back to the initial settings when desired. However in this way, after a disable/enable cycle, the plotting window is not the same as before because the values obtained by plgwpd are not exactly the one previously passed to plwind, a little correction of 1.e-5 is made in the plwind code. Maybe adding a function similar to the one I propose in the C api (with exact window settings) could be a simple approach!? I could try provide a patch if this may help. thank you for your help and best regards, Davide SUBROUTINE clip_on_off() USE plplot IMPLICIT NONE REAL(kind=plflt) :: nxmin, nxmax, nymin, nymax, & wxmin, wxmax, wymin, wymax REAL(kind=plflt), SAVE :: snxmin, snxmax, snymin, snymax, & swxmin, swxmax, swymin, swymax LOGICAL, SAVE :: clip_status = .TRUE. IF (clip_status) THEN ! get and save the settings CALL plgvpd (nxmin, nxmax, nymin, nymax) CALL plgvpw (wxmin, wxmax, wymin, wymax) snxmin = nxmin; snxmax = nxmax snymin = nymin; snymax = nymax swxmin = wxmin; swxmax = wxmax swymin = wymin; swymax = wymax ! compute new "fullscreen" plotting window wxmin = swxmin - (wxmax-wxmin)/(nxmax-nxmin)*(nxmin) wxmax = swxmax + (wxmax-wxmin)/(nxmax-nxmin)*(1.0_plflt-nxmax) wymin = swymin - (wymax-wymin)/(nymax-nymin)*(nymin) wymax = swymax + (wymax-wymin)/(nymax-nymin)*(1.0_plflt-nymax) ! set viewport and plotting window to "fullscreen" CALL plvpor(0.0_plflt, 1.0_plflt, 0.0_plflt, 1.0_plflt) CALL plwind(wxmin, wxmax, wymin, wymax) clip_status = .FALSE. ELSE ! restore previous settings CALL plvpor(snxmin, snxmax, snymin, snymax) CALL plwind(swxmin, swxmax, swymin, swymax) clip_status = .TRUE. ENDIF END SUBROUTINE clip_on_off -- ============================= Davide Cesari ============================ Servizio IdroMeteorologico ARPA Emilia Romagna Area Modellistica Numerica e Radarmeteorologia Phone/Fax: +39 051525926/+39 0516497501 Home page: http://www.webalice.it/o.drofa/davide/ ======================================================================== |
From: Davide C. <dc...@ar...> - 2008-09-25 14:27:25
|
Dear plplot subscribers, I would like to repeatedly enable/disable viewport clipping while plotting, in order to draw lines, symbols, etc. in a legend outside the plot, while retaining clipping when data is plotted. Is there a simple way to do this in plplot, or is clipping-disable in the TODO list? Up to now i found a suboptimal solution (see fortran subroutine further in text) by calling plgvpd/plgvpw to get viewport/window settings, setting viewport to [0.,1.],[0.,1.] and enlarging correspondingly the plotting window, then switching back to the initial settings when desired. However in this way, after a disable/enable cycle, the plotting window is not the same as before because the values obtained by plgwpd are not exactly the one previously passed to plwind, a little correction of 1.e-5 is made in the plwind code. Maybe adding a function similar to the one I propose in the C api (with exact window settings) could be a simple approach!? I could try provide a patch if this may help. Thank you for your help and best regards, Davide SUBROUTINE clip_on_off() USE plplot IMPLICIT NONE REAL(kind=plflt) :: nxmin, nxmax, nymin, nymax, & wxmin, wxmax, wymin, wymax REAL(kind=plflt), SAVE :: snxmin, snxmax, snymin, snymax, & swxmin, swxmax, swymin, swymax LOGICAL, SAVE :: clip_status = .TRUE. IF (clip_status) THEN ! get and save the settings CALL plgvpd (nxmin, nxmax, nymin, nymax) CALL plgvpw (wxmin, wxmax, wymin, wymax) snxmin = nxmin; snxmax = nxmax snymin = nymin; snymax = nymax swxmin = wxmin; swxmax = wxmax swymin = wymin; swymax = wymax ! compute new "fullscreen" plotting window wxmin = swxmin - (wxmax-wxmin)/(nxmax-nxmin)*(nxmin) wxmax = swxmax + (wxmax-wxmin)/(nxmax-nxmin)*(1.0_plflt-nxmax) wymin = swymin - (wymax-wymin)/(nymax-nymin)*(nymin) wymax = swymax + (wymax-wymin)/(nymax-nymin)*(1.0_plflt-nymax) ! set viewport and plotting window to "fullscreen" CALL plvpor(0.0_plflt, 1.0_plflt, 0.0_plflt, 1.0_plflt) CALL plwind(wxmin, wxmax, wymin, wymax) clip_status = .FALSE. ELSE ! restore previous settings CALL plvpor(snxmin, snxmax, snymin, snymax) CALL plwind(swxmin, swxmax, swymin, swymax) clip_status = .TRUE. ENDIF END SUBROUTINE clip_on_off -- ============================= Davide Cesari ============================ Servizio IdroMeteorologico ARPA Emilia Romagna Area Modellistica Numerica e Radarmeteorologia Phone/Fax: +39 051525926/+39 0516497501 E-mail: dc...@ar... Home page: http://www.webalice.it/o.drofa/davide/ Address: ARPA-SIM, Viale Silvani 6, 40122 Bologna, Italy ======================================================================== |
From: Hezekiah M. C. <hc...@at...> - 2008-09-28 03:26:50
|
On Thu, Sep 25, 2008 at 10:05 AM, Davide Cesari <dc...@ar...> wrote: > I would like to repeatedly enable/disable viewport clipping while > plotting, in order to draw lines, symbols, etc. in a legend outside the > plot, while retaining clipping when data is plotted. Is there a simple > way to do this in plplot, or is clipping-disable in the TODO list? > Up to now i found a suboptimal solution (see fortran subroutine further > in text) by calling plgvpd/plgvpw to get viewport/window settings, > setting viewport to [0.,1.],[0.,1.] and enlarging correspondingly the > plotting window, then switching back to the initial settings when > desired. However in this way, after a disable/enable cycle, the plotting > window is not the same as before because the values obtained by plgwpd > are not exactly the one previously passed to plwind, a little correction > of 1.e-5 is made in the plwind code. Maybe adding a function similar to > the one I propose in the C api (with exact window settings) could be a > simple approach!? I could try provide a patch if this may help. While I do not have a better method to propose at this time, I have faced the same plgvpw offset issue. This 1.0e-5 offset seems to be an intentional adjustment - see plwind.c, starting at line 56: --- FROM plwind.c, STARTING AT LINE 56 --- dx = (xmax - xmin) * 1.0e-5; dy = (ymax - ymin) * 1.0e-5; /* The true plot window is made slightly larger than requested so that */ /* the end limits will be on the graph */ plsc->vpwxmi = xmin - dx; plsc->vpwxma = xmax + dx; plsc->vpwymi = ymin - dy; plsc->vpwyma = ymax + dy; --- END OF plwind.c PASTE --- plsc->pvpw* are the values returned by plgvpw. The simplest immediate solution would be to invert the above viewport adjustments to retrieve the original viewport dimensions. For the PLplot core developers - would it be an acceptable change to have plgvpw return the proper xmin, xmax, ymin, ymax values rather than these adjusted values? It would probably be less surprising for a user than the current function return values. It is a change from how the function has worked in the past but I think it may be a worthwhile one. If this is an acceptable change I would be happy to supply a patch to implement this. Another option would be to create a new function which returns the properly transformed plot limits. Hez -- Hezekiah M. Carty Graduate Research Assistant University of Maryland Department of Atmospheric and Oceanic Science |
From: Andrew R. <and...@us...> - 2008-09-29 08:16:53
|
On Sat, Sep 27, 2008 at 11:26:40PM -0400, Hezekiah M. Carty wrote: > On Thu, Sep 25, 2008 at 10:05 AM, Davide Cesari <dc...@ar...> wrote: > > I would like to repeatedly enable/disable viewport clipping while > > plotting, in order to draw lines, symbols, etc. in a legend outside the > > plot, while retaining clipping when data is plotted. Is there a simple > > way to do this in plplot, or is clipping-disable in the TODO list? > > Up to now i found a suboptimal solution (see fortran subroutine further > > in text) by calling plgvpd/plgvpw to get viewport/window settings, > > setting viewport to [0.,1.],[0.,1.] and enlarging correspondingly the > > plotting window, then switching back to the initial settings when > > desired. However in this way, after a disable/enable cycle, the plotting > > window is not the same as before because the values obtained by plgwpd > > are not exactly the one previously passed to plwind, a little correction > > of 1.e-5 is made in the plwind code. Maybe adding a function similar to > > the one I propose in the C api (with exact window settings) could be a > > simple approach!? I could try provide a patch if this may help. > > While I do not have a better method to propose at this time, I have > faced the same plgvpw offset issue. This 1.0e-5 offset seems to be an > intentional adjustment - see plwind.c, starting at line 56: > > --- FROM plwind.c, STARTING AT LINE 56 --- > dx = (xmax - xmin) * 1.0e-5; > dy = (ymax - ymin) * 1.0e-5; > > /* The true plot window is made slightly larger than requested so that */ > /* the end limits will be on the graph */ > > plsc->vpwxmi = xmin - dx; > plsc->vpwxma = xmax + dx; > plsc->vpwymi = ymin - dy; > plsc->vpwyma = ymax + dy; > --- END OF plwind.c PASTE --- > > plsc->pvpw* are the values returned by plgvpw. The simplest immediate > solution would be to invert the above viewport adjustments to retrieve > the original viewport dimensions. > > For the PLplot core developers - would it be an acceptable change to > have plgvpw return the proper xmin, xmax, ymin, ymax values rather > than these adjusted values? It would probably be less surprising for > a user than the current function return values. It is a change from > how the function has worked in the past but I think it may be a > worthwhile one. > > If this is an acceptable change I would be happy to supply a patch to > implement this. Another option would be to create a new function which > returns the properly transformed plot limits. Hez, In my view your proposal to reverse the adjustment for plgvpw makes sense. The user would expect to get back the values they put in. A patch to correct this would be acceptable to me at least as a temporary fix. Adding and removing this small adjustment leads to the possibility of rounding errors, so in the long term a better way might have to be sought. The adjustment itself seems a bit of a fudge and there might well be a better way of handling the edges of the viewport to ensure the end limits do appear on the graph. This won't actually be required for all applications of the viewport anyway, only if the viewport has axis tics on it. This might need thinking about further. I suggest further followup goes to plplot-devel as this is a development issue. Cheers Andrew |
From: Hezekiah M. C. <hc...@at...> - 2008-09-29 17:13:53
|
On Mon, Sep 29, 2008 at 4:16 AM, Andrew Ross <and...@us...> wrote: > In my view your proposal to reverse the adjustment for plgvpw makes > sense. The user would expect to get back the values they put in. A > patch to correct this would be acceptable to me at least as a temporary > fix. <snip> > I suggest further followup goes to plplot-devel as this is a development > issue. Andrew, Thanks for the response. I have an inital patch for plgvpw, so I will move this discussion over to the development list. Hez -- Hezekiah M. Carty Graduate Research Assistant University of Maryland Department of Atmospheric and Oceanic Science |