|
forums.silverfrost.com Welcome to the Silverfrost forums
|
View previous topic :: View next topic |
Author |
Message |
DanRRight
Joined: 10 Mar 2008 Posts: 2866 Location: South Pole, Antarctica
|
Posted: Tue Oct 05, 2021 8:16 am Post subject: Limitation of number of plots in %PL |
|
|
Paul,
What is the limit on number of curves with %PL if they are built as "independent" ? I tried more than 10 curves but failed. I remember we discussed here that it would be great to increase this. Is it doable or needs much work ?
Tried to reproduce this nice plot made ages ago using professional contour software. The greatness of it is that it actually displays the evolution movie in one static XY plot !
Last edited by DanRRight on Tue Oct 05, 2021 11:05 pm; edited 2 times in total |
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 711 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Tue Oct 05, 2021 10:13 am Post subject: |
|
|
Dan,
This should work, the thing to remember is that if n_graphs > 10 and more than one related call is made to winop@ then the value of n_graphs must be included in the first call to winop@. |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8017 Location: Salford, UK
|
Posted: Tue Oct 05, 2021 5:17 pm Post subject: |
|
|
The following sample program illustrates a way to draw multiple curves on one set of axes via a callback function. Details can be found in cwplus.enh.
Code: | WINAPP
MODULE mymod
USE mswin
INTEGER,PARAMETER::N=11
DOUBLE PRECISION x(N),y(N)
CONTAINS
INTEGER FUNCTION cb()
DOUBLE PRECISION xx(5),yy(5)
CALL set_plot_mode@(1)
CALL set_line_width@(2)
CALL draw_curvesD@(x,y,N,RGB@(0,0,255))
CALL draw_line_betweenD@(0d0, 0d0, x(N), y(N), 255)
CALL draw_line_betweenD@(0d0, 0d0, x(1), y(1), 255)
CALL draw_rectangleD@(0.1d0, 0.1d0, 0.3d0, 0.15d0, RGB@(0,255,0))
CALL draw_filled_ellipseD@(-0.1d0, 0.15d0, 0.04d0, 0.02d0, RGB@(0,255,0))
CALL draw_charactersD@("Caption", 0.1d0, 0.2d0, 0)
xx = (/0d0, 0.05d0, 0.05d0, 0d0, 0d0/)
yy = (/0d0, 0d0, 0.035d0, 0.035d0, 0d0/)
CALL draw_filled_polygonD@(xx,yy,5,RGB@(0,0,255))
CALL draw_symbolsD@(x,y,N,11,5,255)
CALL set_plot_mode@(0)
cb = 2
END FUNCTION
END MODULE mymod
PROGRAM main
USE mymod
INTEGER i
DO i=1,N
x(i)=0.1d0*(i-6)
y(i)=x(i)*x(i)
ENDDO
i=winio@('%ca[Quadratic]%pv&')
CALL winop@("%pl[title=Graph]") !graph title
CALL winop@("%pl[y_max=0.25]") !maximum y value on axis
CALL winop@("%pl[x_array]") !the data provides other max and min values
CALL winop@("%pl[smoothing=5]")
CALL winop@("%pl[link=user]") !all lines and symbols drawn via set_plot_mode@
CALL winop@("%pl[frame]")
i=winio@('%^pl&',400,250,N,x,y,cb)
i=winio@('%sf%ff%nl%cn%tt[OK]')
END
|
|
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2866 Location: South Pole, Antarctica
|
Posted: Tue Oct 05, 2021 9:06 pm Post subject: |
|
|
Very cool, thanks, Paul
Here is your example with 50 curves added:
Code: | WINAPP
MODULE mymod
USE mswin
INTEGER,PARAMETER::N=11
DOUBLE PRECISION x(N),y(N),xprev(N),yprev(N)
CONTAINS
INTEGER FUNCTION cb()
DOUBLE PRECISION xx(5),yy(5)
CALL set_plot_mode@(1)
CALL set_line_width@(2)
nCurves = 50
do ii=0,nCurves
y(:) = yprev(:)+0.2/nCurves*ii
CALL draw_curvesD@(x,y,N,RGB@(max(0,-255+ii*2*255/ncurves),255-abs(255-ii*2*255/ncurves),max(0,255-ii*2*255/ncurves)))
enddo
y(:) = yprev(:)
CALL draw_line_betweenD@(0d0, 0d0, x(N), y(N), 255)
CALL draw_line_betweenD@(0d0, 0d0, x(1), y(1), 255)
CALL draw_rectangleD@(0.1d0, 0.1d0, 0.3d0, 0.15d0, RGB@(0,255,0))
CALL draw_filled_ellipseD@(-0.1d0, 0.15d0, 0.04d0, 0.02d0, RGB@(0,255,0))
CALL draw_charactersD@("Caption", 0.1d0, 0.2d0, 0)
xx = (/0d0, 0.05d0, 0.05d0, 0d0, 0d0/)
yy = (/0d0, 0d0, 0.035d0, 0.035d0, 0d0/)
CALL draw_filled_polygonD@(xx,yy,5,RGB@(0,0,255))
CALL draw_symbolsD@(x,y,N,11,5,255)
CALL set_plot_mode@(0)
cb = 2
END FUNCTION
END MODULE mymod
PROGRAM main
USE mymod
INTEGER i
DO i=1,N
x(i)=0.1d0*(i-6)
y(i)=x(i)*x(i)
ENDDO
xprev(:)=x(:)
yprev(:)=y(:)
i=winio@('%ca[Quadratic]%pv&')
CALL winop@("%pl[title=Graph]") !graph title
CALL winop@("%pl[y_max=0.25]") !maximum y value on axis
CALL winop@("%pl[x_max=0.39]") !maximum X value <--------------
CALL winop@("%pl[x_array]") !the data provides other max and min values
CALL winop@("%pl[smoothing=5]")
CALL winop@("%pl[link=user]") !all lines and symbols drawn via set_plot_mode@
CALL winop@("%pl[frame]")
i=winio@('%^pl&',600,400,N,x,y,cb)
i=winio@('%sf%ff%nl%cn%tt[OK]%es')
END |
By the way i like %es ESCape acceleration key to exit the program. Recommend.
ADDITION: Have you noticed one small defect after i added x_max =marked as <-------- ?
Last edited by DanRRight on Tue Oct 05, 2021 10:58 pm; edited 1 time in total |
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2866 Location: South Pole, Antarctica
|
Posted: Tue Oct 05, 2021 10:38 pm Post subject: |
|
|
Ken,
Your comment how to make n_graphs > 10 usual way i did not understand, sorry . I have done it this way which does not work if i use Nt (number of curves) more than 10. here is working example with 10
Code: |
USE mswin
INTEGER,PARAMETER:: Nx=11, Nt=10
DOUBLE PRECISION Xmp(Nx,Nt),Ymp(Nx,Nt)
integer Np(Nt)
integer, external :: SnapshotMultiplotPL
DO j = 1,Nt
Np(j) = Nx
do i = 1,Nx
Xmp(i,j)=0.1d0 * (i-(Nx+1)/2)
Ymp(i,j)=Xmp(i,j)**2 + 0.2/Nt * j
enddo
endDO
i=winio@('%ww%fn[Tahoma]%bf&')
i=winio@('%ts&', 2.0d0)
call winop@('%pl[x_axis="Radius ( um )"]')
call winop@('%pl[y_axis="Temperature ( eV )"]')
call winop@("%pl[file=MultiplotPL1.set]")
i=winio@('%pv%pl[frame,framed,axes_pen=2,frame_pen=2,etched,'//&
'width=2,x_array,independent,n_graphs=10]%ff&',&
1000,700, Np,&
Xmp(1,1), Ymp(1,1), Xmp(1,2), Ymp(1,2), Xmp(1,3), Ymp(1,3),&
Xmp(1,4), Ymp(1,4), Xmp(1,5), Ymp(1,5), Xmp(1,6), Ymp(1,6),&
Xmp(1,7), Ymp(1,7), Xmp(1,8), Ymp(1,8), Xmp(1,9), Ymp(1,9),&
Xmp(1,10),Ymp(1,10))
i=winio@('%ts&', 1.0d0)
i=winio@('%cn%^tt[Snapshot]%es', SnapshotMultiplotPL)
MultiplotPL = 2
end ! function
!......................................................
! ____ __ _ __ ____ ____ _ _ __ ____
! / ___)( ( \ / _\ ( _ \/ ___)/ )( \ / \ (_ _)
! \___ \/ // \ ) __/\___ \) __ (( O ) )(
! (____/\_)__)\_/\_/(__) (____/\_)(_/ \__/ (__)
!......................................................
integer function SnapshotMultiplotPL()
use clrwin
character PNGfilename*256, chdate*8, chtime*10, chzone*5
integer ivalues(8)
call DATE_AND_TIME(chdate, chtime, chzone, ivalues ) ! chdate format 20210504
PNGfilename='zDesignerPL_'//chdate(1:8)//'_'//chtime(1:6)//'.png'
i = export_image@(trim(PNGfilename))
call sound@(3000,1)
call sound@(1000,1)
call sound@(2000,1)
SnapshotMultiplotPL= 2
end function
|
Last edited by DanRRight on Wed Oct 06, 2021 4:59 am; edited 2 times in total |
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2866 Location: South Pole, Antarctica
|
Posted: Wed Oct 06, 2021 4:51 am Post subject: |
|
|
And if i just change Nt and n_graphs to 12 and add two more pairs of Xmp, Ymp to make 12 curves then i got crash with the error message "Invalid n_graphs in %PL specification". Here is the full text
Code: | USE mswin
INTEGER,PARAMETER:: Nx=11, Nt=12
DOUBLE PRECISION Xmp(Nx,Nt),Ymp(Nx,Nt)
integer Np(Nt)
integer, external :: SnapshotMultiplotPL
DO j = 1,Nt
Np(j) = Nx
do i = 1,Nx
Xmp(i,j)=0.1d0 * (i-(Nx+1)/2)
Ymp(i,j)=Xmp(i,j)**2 + 0.2/Nt * j
enddo
endDO
i=winio@('%ww%fn[Tahoma]%bf&')
i=winio@('%ts&', 2.0d0)
call winop@('%pl[x_axis="Radius ( um )"]')
call winop@('%pl[y_axis="Temperature ( eV )"]')
call winop@("%pl[file=MultiplotPL1.set]")
i=winio@('%pv%pl[frame,framed,axes_pen=2,frame_pen=2,etched,'//&
'width=2,x_array,independent,n_graphs=12]%ff&',&
1000,700, Np,&
Xmp(1,1), Ymp(1,1), Xmp(1,2), Ymp(1,2), Xmp(1,3), Ymp(1,3),&
Xmp(1,4), Ymp(1,4), Xmp(1,5), Ymp(1,5), Xmp(1,6), Ymp(1,6),&
Xmp(1,7), Ymp(1,7), Xmp(1,8), Ymp(1,8), Xmp(1,9), Ymp(1,9),&
Xmp(1,10),Ymp(1,10),Xmp(1,11),Ymp(1,11),Xmp(1,12),Ymp(1,12))
i=winio@('%ts&', 1.0d0)
i=winio@('%cn%^tt[Snapshot]%es', SnapshotMultiplotPL)
MultiplotPL = 2
end ! function |
I scaled compiler just one step down, because 8.80 does now allow me to use debugger with other codes and i temporally can not change it to 8.80 because lot of programs are running. Is this the reason possibly? |
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 711 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Wed Oct 06, 2021 12:59 pm Post subject: |
|
|
Dan,
Here is a modification to your second example that now works as expected.
Ken
Code: | USE mswin
INTEGER,PARAMETER:: Nx=11, Nt=12
DOUBLE PRECISION Xmp(Nx,Nt),Ymp(Nx,Nt)
integer Np(Nt)
integer, external :: SnapshotMultiplotPL
DO j = 1,Nt
Np(j) = Nx
do i = 1,Nx
Xmp(i,j)=0.1d0 * (i-(Nx+1)/2)
Ymp(i,j)=Xmp(i,j)**2 + 0.2/Nt * j
enddo
endDO
i=winio@('%ww%fn[Tahoma]%bf&')
i=winio@('%ts&', 2.0d0)
call winop@('%pl[n_graphs=12]') !### n_graphs=12 is in the first call to winop@
call winop@('%pl[x_axis="Radius ( um )"]')
call winop@('%pl[y_axis="Temperature ( eV )"]')
call winop@("%pl[file=MultiplotPL1.set]")
i=winio@('%pv%pl[frame,framed,axes_pen=2,frame_pen=2,etched,'//&
'width=2,x_array,independent]%ff&',& ! ### n_graphs=12 removed
1000,700, Np,&
Xmp(1,1), Ymp(1,1), Xmp(1,2), Ymp(1,2), Xmp(1,3), Ymp(1,3),&
Xmp(1,4), Ymp(1,4), Xmp(1,5), Ymp(1,5), Xmp(1,6), Ymp(1,6),&
Xmp(1,7), Ymp(1,7), Xmp(1,8), Ymp(1,8), Xmp(1,9), Ymp(1,9),&
Xmp(1,10),Ymp(1,10),Xmp(1,11),Ymp(1,11),Xmp(1,12),Ymp(1,12))
i=winio@('%ts&', 1.0d0)
i=winio@('%cn%^tt[Snapshot]%es', SnapshotMultiplotPL)
MultiplotPL = 2
end ! function |
|
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2866 Location: South Pole, Antarctica
|
Posted: Wed Oct 06, 2021 5:54 pm Post subject: |
|
|
Ken,
Wow ! Gazillion monkeys randomly hitting keyboards would probably earlier write "War and Peace" than me logically finding this so counterintuitive solution ! Are
Code: | call winop@('%pl[n_graphs=12]') |
and
Code: | i=winio@('%pl[n_graphs=12]') |
NOT THE SAME ??????
How did you find it?
Paul, how this could ever being included in design ? |
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 711 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Wed Oct 06, 2021 7:54 pm Post subject: |
|
|
Dan,
This works without calls to winop@ before the i=winio@ function call:
Code: | USE mswin
INTEGER,PARAMETER:: Nx=11, Nt=12
DOUBLE PRECISION Xmp(Nx,Nt),Ymp(Nx,Nt)
integer Np(Nt)
integer, external :: SnapshotMultiplotPL
DO j = 1,Nt
Np(j) = Nx
do i = 1,Nx
Xmp(i,j)=0.1d0 * (i-(Nx+1)/2)
Ymp(i,j)=Xmp(i,j)**2 + 0.2/Nt * j
enddo
endDO
i=winio@('%ww%fn[Tahoma]%bf&')
i=winio@('%ts&', 2.0d0)
i=winio@('%pv%pl[x_axis="Radius ( um )",y_axis="Temperature ( eV )",'//&
'file=MultiplotPL1.set,frame,framed,axes_pen=2,frame_pen=2,etched,'//&
'width=2,x_array,independent,n_graphs=12]%ff&',&
1000,700, Np,&
Xmp(1,1), Ymp(1,1), Xmp(1,2), Ymp(1,2), Xmp(1,3), Ymp(1,3),&
Xmp(1,4), Ymp(1,4), Xmp(1,5), Ymp(1,5), Xmp(1,6), Ymp(1,6),&
Xmp(1,7), Ymp(1,7), Xmp(1,8), Ymp(1,8), Xmp(1,9), Ymp(1,9),&
Xmp(1,10),Ymp(1,10),Xmp(1,11),Ymp(1,11),Xmp(1,12),Ymp(1,12))
i=winio@('%ts&', 1.0d0)
i=winio@('%cn%^tt[Snapshot]%es', SnapshotMultiplotPL)
MultiplotPL = 2
end ! function |
This also works, where calls to winop@ "preload" all the %pl configuration data:
Code: | USE mswin
INTEGER,PARAMETER:: Nx=11, Nt=12
DOUBLE PRECISION Xmp(Nx,Nt),Ymp(Nx,Nt)
integer Np(Nt)
integer, external :: SnapshotMultiplotPL
DO j = 1,Nt
Np(j) = Nx
do i = 1,Nx
Xmp(i,j)=0.1d0 * (i-(Nx+1)/2)
Ymp(i,j)=Xmp(i,j)**2 + 0.2/Nt * j
enddo
endDO
i=winio@('%ww%fn[Tahoma]%bf&')
i=winio@('%ts&', 2.0d0)
call winop@('%pl[n_graphs=12]')
call winop@('%pl[x_axis="Radius ( um )"]')
call winop@('%pl[y_axis="Temperature ( eV )"]')
call winop@("%pl[file=MultiplotPL1.set]")
call winop@('%pl[frame,framed,axes_pen=2,frame_pen=2,etched,width=2,x_array,independent]')
i=winio@('%pv%pl%ff&',1000,700, Np,&
Xmp(1,1), Ymp(1,1), Xmp(1,2), Ymp(1,2), Xmp(1,3), Ymp(1,3),&
Xmp(1,4), Ymp(1,4), Xmp(1,5), Ymp(1,5), Xmp(1,6), Ymp(1,6),&
Xmp(1,7), Ymp(1,7), Xmp(1,8), Ymp(1,8), Xmp(1,9), Ymp(1,9),&
Xmp(1,10),Ymp(1,10),Xmp(1,11),Ymp(1,11),Xmp(1,12),Ymp(1,12))
i=winio@('%ts&', 1.0d0)
i=winio@('%cn%^tt[Snapshot]%es', SnapshotMultiplotPL)
MultiplotPL = 2
end ! function |
See items 379, 394 of cwplus.enh |
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2866 Location: South Pole, Antarctica
|
Posted: Wed Oct 06, 2021 11:48 pm Post subject: |
|
|
So what was wrong in my 12-curve example versus working 10-curve example? The 2-curves were working, 3-curves were working, 10-cureves were working and abruptly more were not?
!-----------------------------------------
Not related question: In %PL we set the colors of curves this way
CALL winop@("%pl[colour=#110011]")
How to extract this color for using with draw_filled_polygon@ or draw_symbols@ which use RGB@() for setting colors?
How translate #110011 exactly to what rgb@ gives ?
Or if put this different way, is it possible instead of
CALL winop@("%pl[colour=#110011]")
to set the colors somehow this way
CALL winop@("%pl[colour]"), rgb@(x,y,z) ???? |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8017 Location: Salford, UK
|
Posted: Thu Oct 07, 2021 7:06 am Post subject: |
|
|
#110011 is equivalent to RGB@(17,0,17). 11 is hexadecimal so becomes 16+1 decimal. The order is the same so red is #ff0000 and RGB@(255,0,0).
Here is some code that does the conversion...
Code: | write(str,"(a,z6.6,a)") "%pl[colour=#", RGB@(ired,igreen,iblue), "]" |
|
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2866 Location: South Pole, Antarctica
|
Posted: Thu Oct 07, 2021 9:10 pm Post subject: |
|
|
Thanks Ken and Paul for the hints and tips |
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2866 Location: South Pole, Antarctica
|
Posted: Fri Oct 08, 2021 8:17 pm Post subject: |
|
|
Here is what i got with multiplot (of course case was different from the one shown in first picture). Ideal for planning experiments
|
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2866 Location: South Pole, Antarctica
|
Posted: Mon Oct 11, 2021 8:52 pm Post subject: |
|
|
I spent a day experiencing another devilry bug after noticing that the order of colors in the plot does not correspond to the order in the time history with numbers at the right. Colors at the right are correct, they correspond to natural palette from violet to red. Order of colors in the plot are wrong. Initial 7-8 times are in correct order with the plot history and then abruptly colors on the plot are turned upside down and start with red down to blue
Tried to change anything but this damn order still persists. If i make small demo like i did above both look in correct order. I used standard method of plotting we discussed with Ken which has strange not yet understood behavior. With Paul's method this would not happen but it is too new to me and i do not feel comfortable yet to jump into it as there could be many other pitfalls |
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 711 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Tue Oct 12, 2021 5:59 pm Post subject: |
|
|
Dan,
For the problem you describe, I would check that each :
CALL winop@("%pl[colour=#110011]") etc
is in the correct order for graphs 1 to N. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|