Skip to content

Commit f96f7bc

Browse files
committed
added contour plots
1 parent 32bd5f6 commit f96f7bc

File tree

2 files changed

+109
-1
lines changed

2 files changed

+109
-1
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ The module requires a modern Fortran compiler (it uses various Fortran 2003/2008
1616
Supported plot types
1717
---------------
1818

19-
* ```matplotlib.pyplot.plot``` -- 2D plot of lines and/or markers.
19+
* ```matplotlib.pyplot.plot``` -- 2D/3D plot of lines and/or markers.
2020
* ```matplotlib.pyplot.bar``` -- Make a bar plot.
21+
* ```matplotlib.pyplot.contour``` -- Contour plot
2122

2223
Example
2324
---------------

src/pyplot_module.f90

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,12 @@ module pyplot_module
4545

4646
! public methods
4747
procedure, public :: initialize !! initialize pyplot instance
48+
4849
procedure, public :: add_plot !! add a 2d plot to pyplot instance
4950
procedure, public :: add_3d_plot !! add a 3d plot to pyplot instance
51+
procedure, public :: add_contour !! add a contour plot to pyplot instance
5052
procedure, public :: add_bar !! add a barplot to pyplot instance
53+
5154
procedure, public :: savefig !! save plots of pyplot instance
5255
procedure, public :: destroy !! destroy pyplot instance
5356

@@ -260,6 +263,81 @@ subroutine add_plot(me, x, y, label, linestyle, markersize, linewidth)
260263
end subroutine add_plot
261264
!*****************************************************************************************
262265

266+
!*****************************************************************************************
267+
!> author: Jacob Williams
268+
!
269+
! Add a contour plot.
270+
!
271+
!@note This requires `use_numpy` to be True.
272+
273+
subroutine add_contour(me, x, y, z, label, linestyle, linewidth, levels, color)
274+
275+
class(pyplot), intent (inout) :: me !! pyplot handler
276+
real(wp),dimension(:), intent (in) :: x !! x values
277+
real(wp),dimension(:), intent (in) :: y !! y values
278+
real(wp),dimension(:,:), intent (in) :: z !! z values (a matrix)
279+
character(len=*), intent (in) :: label !! plot label
280+
character(len=*), intent (in) :: linestyle !! style of the plot line
281+
integer, intent (in), optional :: linewidth !! width of the plot line
282+
real(wp),dimension(:), intent (in), optional :: levels !! contour levels to plot
283+
character(len=*), intent (in), optional :: color !! color of the contour line
284+
285+
character(len=:), allocatable :: xstr !! x values strinfied
286+
character(len=:), allocatable :: ystr !! y values strinfied
287+
character(len=:), allocatable :: zstr !! z values strinfied
288+
character(len=:), allocatable :: levelstr !! levels vector strinfied
289+
character(len=max_int_len) :: iline !! actual line width
290+
character(len=*), parameter :: xname = 'x' !! x variable name for script
291+
character(len=*), parameter :: yname = 'y' !! y variable name for script
292+
character(len=*), parameter :: zname = 'z' !! z variable name for script
293+
character(len=*), parameter :: xname_ = 'X' !! X variable name for contour
294+
character(len=*), parameter :: yname_ = 'Y' !! Y variable name for contour
295+
character(len=*), parameter :: zname_ = 'Z' !! Z variable name for contour
296+
character(len=:), allocatable :: extras !! optional stuff
297+
298+
if (allocated(me%str)) then
299+
300+
!convert the arrays to strings:
301+
call vec_to_string(x, xstr, me%use_numpy)
302+
call vec_to_string(y, ystr, me%use_numpy)
303+
call matrix_to_string(z, zstr, me%use_numpy)
304+
if (present(levels)) call vec_to_string(levels, levelstr, me%use_numpy)
305+
306+
!get optional inputs (if not present, set default value):
307+
call optional_int_to_string(linewidth, iline, '3')
308+
309+
!write the arrays:
310+
call me%add_str(trim(xname)//' = '//xstr)
311+
call me%add_str(trim(yname)//' = '//ystr)
312+
call me%add_str(trim(zname)//' = '//zstr)
313+
call me%add_str('')
314+
315+
!convert inputs for contour plotting:
316+
call me%add_str(yname_//', '//xname_//' = np.meshgrid('//trim(xname)//', '//trim(yname)//')')
317+
call me%add_str(zname_//' = '//zname)
318+
319+
!optional arguments:
320+
extras = ''
321+
if (present(levels)) extras = extras//','//'levels='//levelstr
322+
if (present(color)) extras = extras//','//'colors="'//color//'"'
323+
if (present(linewidth)) extras = extras//','//'linewidths='//trim(adjustl(iline))
324+
325+
!write the plot statement:
326+
call me%add_str('CS = ax.contour('//xname_//','//yname_//','//zname_//','//&
327+
'label="'//trim(label)//'",'//&
328+
'linestyles="'//trim(adjustl(linestyle))//'"'//&
329+
extras//')')
330+
331+
call me%add_str('ax.clabel(CS, fontsize=9, inline=1)')
332+
call me%add_str('')
333+
334+
else
335+
error stop 'Error in add_plot: pyplot class not properly initialized.'
336+
end if
337+
338+
end subroutine add_contour
339+
!*****************************************************************************************
340+
263341
!*****************************************************************************************
264342
!> author: Jacob Williams
265343
!
@@ -454,6 +532,35 @@ subroutine vec_to_string(v, str, use_numpy)
454532
end subroutine vec_to_string
455533
!*****************************************************************************************
456534

535+
!*****************************************************************************************
536+
!> author: Jacob Williams
537+
!
538+
! Real matrix (rank 2) to string.
539+
540+
subroutine matrix_to_string(v, str, use_numpy)
541+
542+
real(wp), dimension(:,:), intent(in) :: v !! real values
543+
character(len=:), allocatable, intent(out) :: str !! real values stringified
544+
logical, intent(in) :: use_numpy !! activate numpy python module usage
545+
546+
integer :: i !! counter
547+
integer :: j !! counter
548+
character(len=:),allocatable :: tmp !! dummy string
549+
550+
str = '['
551+
do i=1, size(v,1) !rows
552+
call vec_to_string(v(i,:), tmp, use_numpy) !one row at a time
553+
str = str//trim(adjustl(tmp))
554+
if (i<size(v)) str = str // ','
555+
end do
556+
str = str // ']'
557+
558+
!convert to numpy array if necessary:
559+
if (use_numpy) str = 'np.array('//str//')'
560+
561+
end subroutine matrix_to_string
562+
!*****************************************************************************************
563+
457564
!*****************************************************************************************
458565
!> author: Jacob Williams
459566
! date: 8/16/2015

0 commit comments

Comments
 (0)