colored_contours.f90 Source File


Source Code

program colored_contours_example
    !! Demonstrates colored contour plots with different colormaps
    use fortplot
    implicit none

    call default_gaussian_example()
    call plasma_saddle_example()
    call mixed_colormap_comparison()

contains

    subroutine default_gaussian_example()
        real(wp), dimension(30) :: x_grid, y_grid
        real(wp), dimension(30,30) :: z_grid
        type(figure_t) :: fig
        integer :: i, j

        print *, "=== Default Colorblind-Safe Gaussian Example ==="
        
        ! Generate grid
        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

        ! 2D Gaussian
        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 - Default Colorblind-Safe Colormap")
        call add_contour_filled(x_grid, y_grid, z_grid)  ! Uses default 'crest' colormap
        call savefig('output/example/fortran/colored_contours/gaussian_default.png')
        call savefig('output/example/fortran/colored_contours/gaussian_default.pdf')
        call savefig('output/example/fortran/colored_contours/gaussian_default.txt')
        
        print *, "Created: gaussian_default.png/pdf/txt"
    end subroutine default_gaussian_example

    subroutine plasma_saddle_example()
        real(wp), dimension(25) :: x_grid, y_grid
        real(wp), dimension(25,25) :: z_grid
        real(wp), dimension(8) :: custom_levels
        type(figure_t) :: fig
        integer :: i, j

        print *, "=== Plasma Saddle Function Example ==="
        
        ! Generate grid
        do i = 1, 25
            x_grid(i) = -2.5_wp + (i-1) * 5.0_wp / 24.0_wp
            y_grid(i) = -2.5_wp + (i-1) * 5.0_wp / 24.0_wp
        end do

        ! Saddle function: x^2 - y^2
        do i = 1, 25
            do j = 1, 25
                z_grid(i,j) = x_grid(i)**2 - y_grid(j)**2
            end do
        end do

        ! Custom contour levels
        custom_levels = [-6.0_wp, -4.0_wp, -2.0_wp, -1.0_wp, 1.0_wp, 2.0_wp, 4.0_wp, 6.0_wp]

        call figure(figsize=[8.0_wp, 6.0_wp])
        call xlabel("x")
        call ylabel("y")
        call title("Saddle Function - Plasma Colormap")
        call add_contour_filled(x_grid, y_grid, z_grid, levels=custom_levels, colormap="plasma")
        call savefig('output/example/fortran/colored_contours/saddle_plasma.png')
        call savefig('output/example/fortran/colored_contours/saddle_plasma.pdf')
        call savefig('output/example/fortran/colored_contours/saddle_plasma.txt')
        
        print *, "Created: saddle_plasma.png/pdf/txt"
    end subroutine plasma_saddle_example

    subroutine mixed_colormap_comparison()
        real(wp), dimension(20) :: x_grid, y_grid
        real(wp), dimension(20,20) :: z_grid
        type(figure_t) :: fig1, fig2, fig3
        integer :: i, j

        print *, "=== Colormap Comparison ==="
        
        ! Generate grid
        do i = 1, 20
            x_grid(i) = -2.0_wp + (i-1) * 4.0_wp / 19.0_wp
            y_grid(i) = -2.0_wp + (i-1) * 4.0_wp / 19.0_wp
        end do

        ! Ripple function
        do i = 1, 20
            do j = 1, 20
                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

        ! Inferno colormap
        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/colored_contours/ripple_inferno.png')
        call savefig('output/example/fortran/colored_contours/ripple_inferno.pdf')
        call savefig('output/example/fortran/colored_contours/ripple_inferno.txt')

        ! Coolwarm colormap
        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/colored_contours/ripple_coolwarm.png')
        call savefig('output/example/fortran/colored_contours/ripple_coolwarm.pdf')
        call savefig('output/example/fortran/colored_contours/ripple_coolwarm.txt')

        ! Jet colormap
        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/colored_contours/ripple_jet.png')
        call savefig('output/example/fortran/colored_contours/ripple_jet.pdf')
        call savefig('output/example/fortran/colored_contours/ripple_jet.txt')
        
        print *, "Created: ripple_inferno.png/pdf/txt, ripple_coolwarm.png/pdf/txt, ripple_jet.png/pdf/txt"
        print *, "Colormap comparison complete!"
    end subroutine mixed_colormap_comparison

end program colored_contours_example