contour_demo.f90 Source File


Source Code

program contour_demo
    !! Comprehensive contour plotting examples demonstrating line contours,
    !! filled contours, custom levels, and various colormaps.
    use fortplot
    implicit none

    call demo_basic_contour()
    call demo_mixed_contour_line()
    call demo_filled_contour()
    call demo_colormap_comparison()

contains

    subroutine demo_basic_contour()
        !! Basic contour line plot with Gaussian function
        real(wp), dimension(30) :: x_grid, y_grid
        real(wp), dimension(30, 30) :: z_grid
        integer :: i, j

        print *, "=== Basic Contour Demo ==="

        do i = 1, 30
            x_grid(i) = -3.0_wp + (i - 1) * 6.0_wp / 29.0_wp
            y_grid(i) = -3.0_wp + (i - 1) * 6.0_wp / 29.0_wp
        end do

        do i = 1, 30
            do j = 1, 30
                z_grid(i, j) = exp(-(x_grid(i)**2 + y_grid(j)**2))
            end do
        end do

        call figure(figsize=[8.0_wp, 6.0_wp])
        call xlabel("x")
        call ylabel("y")
        call title("2D Gaussian Function")
        call add_contour(x_grid, y_grid, z_grid, label="exp(-(x^2+y^2))")
        call savefig('output/example/fortran/contour_demo/contour_gaussian.png')
        call savefig('output/example/fortran/contour_demo/contour_gaussian.pdf')
        call savefig('output/example/fortran/contour_demo/contour_gaussian.txt')

        print *, "Created: contour_gaussian.png/pdf/txt"
    end subroutine demo_basic_contour

    subroutine demo_mixed_contour_line()
        !! Contour plot combined with a line plot overlay
        real(wp), dimension(30) :: x_grid, y_grid
        real(wp), dimension(30, 30) :: z_grid
        real(wp), dimension(5) :: custom_levels
        integer :: i, j

        print *, "=== Mixed Contour + Line Demo ==="

        do i = 1, 30
            x_grid(i) = -3.0_wp + (i - 1) * 6.0_wp / 29.0_wp
            y_grid(i) = -3.0_wp + (i - 1) * 6.0_wp / 29.0_wp
        end do

        do i = 1, 30
            do j = 1, 30
                z_grid(i, j) = x_grid(i)**2 - y_grid(j)**2
            end do
        end do

        custom_levels = [-4.0_wp, -2.0_wp, 0.0_wp, 2.0_wp, 4.0_wp]
        call figure(figsize=[8.0_wp, 6.0_wp])
        call xlabel("x")
        call ylabel("y")
        call title("Mixed Plot: Contour + Line")
        call add_contour(x_grid, y_grid, z_grid, levels=custom_levels, label="x^2-y^2")
        call add_plot(x_grid, exp(-x_grid**2), label="Cross-section at y=0")
        call savefig('output/example/fortran/contour_demo/mixed_plot.png')
        call savefig('output/example/fortran/contour_demo/mixed_plot.pdf')
        call savefig('output/example/fortran/contour_demo/mixed_plot.txt')

        print *, "Created: mixed_plot.png/pdf/txt"
    end subroutine demo_mixed_contour_line

    subroutine demo_filled_contour()
        !! Filled contour plots with colorbar
        integer, parameter :: nx = 40, ny = 30
        real(wp) :: x(nx), y(ny)
        real(wp) :: z(ny, nx)
        real(wp) :: r
        integer :: i, j

        print *, "=== Filled Contour Demo ==="

        do i = 1, nx
            x(i) = -3.0_wp + real(i - 1, wp) * 6.0_wp / real(nx - 1, wp)
        end do
        do j = 1, ny
            y(j) = -2.5_wp + real(j - 1, wp) * 5.0_wp / real(ny - 1, wp)
        end do

        do j = 1, ny
            do i = 1, nx
                r = sqrt(x(i)**2 + y(j)**2)
                z(j, i) = sin(3.0_wp * r) * exp(-0.35_wp * r)
            end do
        end do

        call figure(figsize=[7.2_wp, 5.4_wp])
        call title('Filled Contour Demo (plasma)')
        call xlabel('x')
        call ylabel('y')
        call add_contour_filled(x, y, z, colormap='plasma', show_colorbar=.true.)
        call savefig('output/example/fortran/contour_demo/contour_filled.png')
        call savefig('output/example/fortran/contour_demo/contour_filled.pdf')
        call savefig('output/example/fortran/contour_demo/contour_filled.txt')

        print *, "Created: contour_filled.png/pdf/txt"
    end subroutine demo_filled_contour

    subroutine demo_colormap_comparison()
        !! Compare different colormaps with ripple function
        real(wp), dimension(80) :: x_grid, y_grid
        real(wp), dimension(80, 80) :: z_grid
        integer :: i, j

        print *, "=== Colormap Comparison ==="

        do i = 1, 80
            x_grid(i) = -2.0_wp + (i - 1) * 4.0_wp / 79.0_wp
            y_grid(i) = -2.0_wp + (i - 1) * 4.0_wp / 79.0_wp
        end do

        do i = 1, 80
            do j = 1, 80
                z_grid(i, j) = sin(sqrt(x_grid(i)**2 + y_grid(j)**2) * 3.0_wp) &
                    * exp(-0.3_wp * sqrt(x_grid(i)**2 + y_grid(j)**2))
            end do
        end do

        call figure(figsize=[6.4_wp, 4.8_wp])
        call xlabel("x")
        call ylabel("y")
        call title("Ripple Function - Inferno Colormap")
        call add_contour_filled(x_grid, y_grid, z_grid, colormap='inferno')
        call savefig('output/example/fortran/contour_demo/ripple_inferno.png')
        call savefig('output/example/fortran/contour_demo/ripple_inferno.pdf')
        call savefig('output/example/fortran/contour_demo/ripple_inferno.txt')

        call figure(figsize=[6.4_wp, 4.8_wp])
        call xlabel("x")
        call ylabel("y")
        call title("Ripple Function - Coolwarm Colormap")
        call add_contour_filled(x_grid, y_grid, z_grid, colormap='coolwarm')
        call savefig('output/example/fortran/contour_demo/ripple_coolwarm.png')
        call savefig('output/example/fortran/contour_demo/ripple_coolwarm.pdf')
        call savefig('output/example/fortran/contour_demo/ripple_coolwarm.txt')

        call figure(figsize=[6.4_wp, 4.8_wp])
        call xlabel("x")
        call ylabel("y")
        call title("Ripple Function - Jet Colormap")
        call add_contour_filled(x_grid, y_grid, z_grid, colormap='jet')
        call savefig('output/example/fortran/contour_demo/ripple_jet.png')
        call savefig('output/example/fortran/contour_demo/ripple_jet.pdf')
        call savefig('output/example/fortran/contour_demo/ripple_jet.txt')

        print *, "Created: ripple_inferno/coolwarm/jet.png/pdf/txt"
        print *, "Contour demo complete!"
    end subroutine demo_colormap_comparison

end program contour_demo