Hello,

I wanted to ask you for help. I prepare a test program to plot in log scale.
I also prepare such plot in Matlab, where on the left side I put label in more 
detail than in PLplot test program. Is there any possibility to make such plot 
in PLplot as in Matlab, i.e. making more labels on axis Y in log plot?

Have look on file "plplot_test.pdf" and "matlab_test.pdf" and my source code.

For any suggestions or corrections in my program I will be grateful.

I do it in PLplot 5.12.0 and gfortran from gcc-6.3.0.

Thank you in advance.

Andrzej

Attachment: test_matlab.pdf
Description: Adobe PDF document

Attachment: test_plplot.pdf
Description: Adobe PDF document

Attachment: Makefile
Description: Binary data

program plplot_test
use plplot
use plplot_double
implicit none


integer, parameter          :: dp = kind(1d0)
character(len=3), parameter :: infnan(2) = ['Inf','Nan']

integer, parameter :: time = 50

real(dp), dimension(time) :: rms

real(dp) :: nan, inf

  read(infnan,*) inf, nan

  rms = [ &
    3.1253D-1, 2.3104D-1, 1.7497D-1, 1.3670D-1, 1.1087D-1, &
    9.3651D-2, 8.2302D-2, 7.4875D-2, 7.0025D-2, 6.6849D-2, &
    6.4758D-2, 6.3372D-2, 6.2447D-2, 6.1827D-2, 6.1409D-2, &
    6.1127D-2, 6.0936D-2, 6.0807D-2, 6.0720D-2, 6.0660D-2, &
    6.0620D-2, 6.0593D-2, 6.0575D-2, 6.0562D-2, 6.0554D-2, &
    6.0548D-2, 6.0544D-2, 6.0542D-2, 6.0540D-2, 6.0539D-2, &
    6.0538D-2, 6.0538D-2, 6.0537D-2, 6.0537D-2, 6.0537D-2, &
    6.0537D-2, 6.0537D-2, 6.0537D-2, 6.0537D-2, 6.0537D-2, &
    6.0537D-2, 6.0537D-2, 6.0537D-2, 6.0537D-2, 6.0537D-2, &
    6.0537D-2, 6.0537D-2, 6.0537D-2, 6.0537D-2, 6.0537D-2  &
  ]


  call plplot_init('test_plplot.pdf',1,1)
    call loglog(linspace([1, time], time), rms)
  call plplot_finish()


  contains


!=================================================
subroutine plplot_init(filename, nx, ny)
implicit none
character(len=*), intent(in) :: filename
integer, intent(in) :: nx, ny

character(len=*), parameter :: device = "pdfcairo"

  call plsfnam(filename)
  call plsdev(device);
  call plssub(ny, nx)
  call plscolbga(255,255,255,0.3_plflt)
  call plspage (0.0_dp, 0.0_dp, 1080, 810, 0, 0);
  call plinit()
  call plfont(1)
end subroutine
!=================================================
subroutine plplot_finish()
implicit none
  call plend()
end subroutine
!=================================================
subroutine loglog(x,y,color)
implicit none
real(dp), dimension(:), intent(in) :: x, y
integer, optional :: color
real(dp), dimension(size(x)) :: xlog, ylog
integer :: i,n, warn
integer :: finall_color
real(dp) :: mm(4) !  (mm) - values of min and max

  finall_color = 9
  if (present(color)) finall_color = color

  warn = 0
  xlog = x
  ylog = y
  n = size(x)

  call calc_min_max(xlog, ylog, mm)

  if (any(mm <= -inf) .or. any(mm >= inf) .or. any(x <= 0.0) .or. any(y <= 0.0)) then
    do i=1,n
      if (xlog(i) <= 0) xlog(i) = NaN
      if (ylog(i) <= 0) ylog(i) = NaN
    end do

    call calc_min_max(xlog, ylog, mm)

    ! negative values or zero set to its minimum x and y
    do i=1,n
      if (isnan(xlog(i))) xlog(i) = 10**mm(1)
      if (isnan(ylog(i))) ylog(i) = 10**mm(3)
    end do

    print('(/,"*** [loglog]: Changed values 0 or negative and these are not plotted ***",/)')
    warn = 1
  end if

  call plscolbga(255,255,255,0.3_plflt)

  call pladv(0)
  call plvpor(0.135_plflt, 0.97_plflt, 0.13_plflt, 0.88_plflt)

  ! if 10^40 then making plot is to long in time
  if (all(abs(mm) < 40)) then
    call plwind(mm(1), mm(2), mm(3), mm(4))
      call plscol0(0, 0, 0, 0)

    call set_log_grid()
    call set_log_axes()

    call plcol0(finall_color)
    call plwidth(2.0_plflt)
    call plline(log10(xlog), log10(ylog))

    if (warn == 1) then
      call plcol0(1)
      call plstring([sum(mm(1:2))/2.0], [mm(4)*0.95], "Negative/zero values set to minimum value!")
    end if
  else
    call plcol0(1)
    call plwind(0.0_dp, 1.0_dp, 0.0_dp, 1.0_dp)
    call plstring([0.5_dp], [0.5_dp], "Infinity values, so no plot is made!!!")
  end if
end subroutine
!=================================================
subroutine calc_min_max(x, y, xy_MinMax)
implicit none
real(dp), intent(in), dimension(:) :: x, y
real(dp), intent(out), dimension(4) :: xy_MinMax

  xy_MinMax = [ minval(x), maxval(x), minval(y), maxval(y) ]
  xy_MinMax = log10(xy_MinMax)

  where (is_neginf(xy_MinMax)) xy_MinMax = -16.0_dp
  where (is_posinf(xy_MinMax)) xy_MinMax = +16.0_dp
end subroutine
!=================================================
subroutine set_log_grid()
implicit none
integer, parameter :: gray = 240
integer :: r, g, b

  call plwidth(0.7_plflt)
  call plstyl( [1500], [1500] )
  call plgcol0(6, r, g, b)
  call plscol0(6, gray, gray, gray)
    call plcol0(6)
    call plbox('lgh', 0.0_plflt, 0, 'lgh', 0.0_plflt, 0)
  call plscol0(6, r, g, b)
  call plstyl( [integer ::], [integer ::] )
  call plwidth(1.0_plflt)
end subroutine
!=================================================
subroutine set_log_axes()
implicit none
  call plwidth(0.7_plflt)
  call plcol0(0)
  call plstyl( [integer ::], [integer ::] )
  call plbox("lbcnst", 0.0_plflt, 0, "lbcnstv", 0.0_plflt, 0)
  call plwidth(1.0_plflt)
end subroutine
!=================================================
function linspace(z,n) result(x)
implicit none
integer, dimension(2), intent(in) :: z
integer, intent(in) :: n
real(dp) :: x(n), inc_x
integer :: i
  inc_x = (z(2) - z(1)) / (n-1)
  x = [ (z(1) + i * inc_x, i=0,n-1)]
end function
!=================================================
elemental pure function is_neginf(x) result (r)
implicit none
   logical :: r
   real(dp), intent(in) :: x
   r = (x < -huge(x))
end function
!=================================================
elemental pure function is_posinf(x) result (r)
implicit none
   logical :: r
   real(dp), intent(in) :: x
   r = (x > huge(x))
end function
!=================================================
end program
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Plplot-general mailing list
Plplot-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/plplot-general

Reply via email to