twin_axes_demo.f90 Source File


Source Code

program twin_axes_demo
    !! Demonstrates twin x/y axis support with independent scaling and labels
    use iso_fortran_env, only: wp => real64
    use fortplot, only: figure, plot, twinx, twiny, use_axis, xlabel, ylabel, title
    use fortplot, only: legend, set_yscale, set_xscale, savefig_with_status
    use fortplot_errors, only: SUCCESS
    implicit none

    integer, parameter :: n = 120
    real(wp) :: time_hours(n)
    real(wp) :: primary_signal(n)
    real(wp) :: secondary_signal(n)
    real(wp) :: cumulative_index(n)
    integer :: i, status
    logical :: ok

    do i = 1, n
        time_hours(i) = real(i - 1, wp) / 4.0_wp
        primary_signal(i) = 15.0_wp + 8.0_wp * sin( &
            2.0_wp * acos(-1.0_wp) * time_hours(i) / 24.0_wp)
        secondary_signal(i) = 40.0_wp + 10.0_wp * exp(-0.05_wp * time_hours(i))
        cumulative_index(i) = log(1.0_wp + real(i, wp))
    end do

    call figure()
    call plot(time_hours, primary_signal, label='Primary axis')
    call ylabel('Temperature (relative)')

    call twinx()
    call plot(time_hours, secondary_signal, label='Secondary axis')
    call set_yscale('log')
    call ylabel('Humidity (log scale)')

    call twiny()
    call plot(cumulative_index, primary_signal, label='Top axis')
    call set_xscale('log')
    call xlabel('Cumulative index (log scale)')

    call use_axis('primary')
    call xlabel('Time (hours)')
    call title('Twin axis demo')
    call legend()

    ok = .true.
    call savefig_with_status('output/example/fortran/twin_axes_demo/' // &
                             'twin_axes_demo.png', status)
    if (status /= SUCCESS) ok = .false.
    call savefig_with_status('output/example/fortran/twin_axes_demo/' // &
                             'twin_axes_demo.txt', status)
    if (status /= SUCCESS) ok = .false.
    if (.not. ok) then
        print *, 'WARNING: Failed to write one or more twin axis demo outputs'
    end if

end program twin_axes_demo