gnufor2 是一个比较有意思的F90模块,支持命令行模式下接入gnuplot进行绘图。gnufor2本身其实并不牛逼,只不过是写好一个gnuplot可读的文本文件commond_file.txt,文件中包含绘图设置、绘图命令、绘图数据,然后在fortran中用system函数调用gnuplot命令进行绘图。 换句话说,你可以直接在终端中>> gnuplot commond_line.txt得到相同的结果。 因此,想要用好gunfor2最好先预习一下gnuplot。作为一款开源软件,gnuplot几乎可以完全实现其他几个常用科学绘图工具的功能,如Matlab,GMT,Matplotlib等。其功能之纷繁、画图之精美也需要你的研读、学习、测试。

修改后函数库

!
! modified by F. Cheng, Sep 30, 2016
!   v.01 change real*8 data to real*4 data
!        add xlable,ylable,xyrange setting
!        add '.eps' and '.emf' format output
!        add colorbox default for image
!        add 'jetmap' and 'moreland' palette for geophycist
!
    subroutine plot_1(x1,y1,style,pause,color1,terminal,filename,polar,persist,input,&
                    linewidth,xlable,ylable,xyrange)
!***********************************************************************************
! this subroutine plots 1 2D graph
! x1,y1 real*4 N
    subroutine plot_2(x1,y1,x2,y2,style,pause,color1,color2,terminal,filename,polar,&
                    persist,input,linewidth,xlable,ylable,xyrange)
!***********************************************************************************
! this subroutine plots 2 2D graphs in the same coordinate system
! x1,y1,x2,y2 real*4 N
    subroutine plot_3(x1,y1,x2,y2,x3,y3,style,pause,color1,color2,color3,terminal,&
                    filename,polar,persist,input,linewidth,xlable,ylable,xyrange)
!***********************************************************************************
! this subroutine plots 3 2D graphs in the same coordinate system
! x1,y1,x2,y2,x3,y3 real*4 N
    subroutine plot_4(x1,y1,x2,y2,x3,y3,x4,y4,style,pause,color1,color2,color3,color4,&
                    terminal,filename,polar,persist,input,linewidth,xlable,ylable,xyrange)
!***********************************************************************************
! this subroutine plots 4 2D graphs in the same coordinate system
! x1,y1,x2,y2,x3,y3,x4,y4 real*4 N
    subroutine surf_1(xyz,pause,palette,terminal,filename,pm3d,contour,persist,input)
!***********************************************************************************
! this is the most general subroutine for generating 3D plots.
! The data is contained in a 3D array xyz(:,:,:)
! xyz real*4 3*nx*ny
    subroutine surf_2(z,pause,palette,terminal,filename,pm3d,contour,persist,input)
!***********************************************************************************
! this subroutine plots a 3D surface. The only input is a 2D array z(:,:), the x-y grid
! is generated automatically
! z real*4 nx*ny
    subroutine surf_3(x,y,z,pause,palette,terminal,filename,pm3d,contour,persist,input)
!***********************************************************************************
! this subroutine plots a 3D surface. x and y are 1D arrays needed to generate the x-y grid
! z(:,:) is a 2D array
! z real*4 3*nx*ny
! x real*4 nx
! y real*4 ny
    subroutine hist(x,n,pause,color,terminal,filename,persist,input)
!***********************************************************************************
! this subroutine plots the histogram of data contained in 1D array x, using n bins as step
    subroutine plot3d(x,y,z,pause,color,terminal,filename,persist,input,linewidth)
!***********************************************************************************
! this subroutine plots 3D curve, given by three 1D arrays x,y,z
    subroutine image_1(gray,pause,palette,terminal,filename,persist,input)
!***********************************************************************************
! this is the most general subroutine for generating 2D surface.
! The data is contained in a 2D array gray(:,:)
! gray real*4 N*M
    subroutine image_2(x,y,gray,pause,palette,terminal,filename,persist,input,xlable,ylable,xyrange)
!***********************************************************************************
! Generating 2D surface
! gray real*4 N*M
! x    real*4 N
! y    real*4 M
    subroutine image_3(rgb,pause,terminal,filename,persist,input)
!***********************************************************************************
! Generating 2D surface with corresponding RGB value.
! rgb real*4 N*M
! 0<rgb<255
    subroutine image_4(x,y,rgb,pause,terminal,filename,persist,input,xlable,ylable,xyrange)
!***********************************************************************************
! Generating 2D surface with corresponding RGB value
! rgb  real*4  3*N*M
! x    real*4  N
! y    real*4  M
! 0<rgb<255

绘制一维曲线

call plot(x1,y1,style='22-',terminal='ps',filename='fig1.ps')

绘图效果如下:

  • ps格式图片可以放在Latex中,本博客网页中使用的是转换后的png格式图片

1. 如何设置输出图片格式

定义terminal参数,模块支持’eps’,‘ps’,‘emf’,其他格式将在默认’wxt’模式下以’png’形式输出。

2. 如何定义曲线风格

定义style参数,模块支持‘实线’,‘点-实线’,‘点线’三种格式绘制曲线,默认情况下以’实线’型输出。 绘制单条曲线时,style是个3字符的字符串变量,前两个字符(包括数字或者空格)定义大小,第三个字符如果是’-‘则定义为’点-实线’风格,否则只要style变量存在即为‘点线’。 绘制多条曲线,成倍增加style长度。

3. 如何定义曲线宽度

定义linewidth参数,默认是1

4. 如何定义曲线颜色

定义color1等4个参数,默认是蓝、绿、红、橙。

5. 如何输出图片

定义filename参数,即为输出图片名称。默认情况不输出图片,但是在定义terminal而没有定义filename的情况下,将会以当前日期作为文件名输出无后缀图片,其图片格式即为terminal所定义的格式。

6. 如何绘制极坐标图

定义polar参数,默认为直角坐标绘图,即polar='no'

7. 如何在程序运行过程中显示图片

定义pause参数,默认情况pause=0,即图片不显示。当pause=n且大于0时,暂停n秒;当pause=n且小于0时,程序暂停开始显示图片直到在终端输入enter

8. 如何自己用gnuplot绘制相同的图片

默认情况下,模块每绘制一张图会生成一个commond_file.txtdata_file.txt(后者会覆盖前者)。在终端可以通过$ gnuplot commond_file.txt重复模块中相应的操作,而且还可以通过更改commond_file.txt中的相应操作让图片绘制的更精美。当绘制多张图片想保存相应命令和数据文件时,可以通过input参数设定输出文件名commond_file_input.txtdata_file_input.txt

9. 如何让程序结束后图片窗口继续显示

定义persist,默认图片不会持续存在,即persist='yes'

绘制二维平面图

call image(f,v,fv,terminal='eps',filename='fig2.eps')

1. 如何更改image的调色板

定义palette参数,默认CMY模式。但是包括gnuplot包涵的几种调色板在内,我个人都不喜欢。作为一名地球物理的学生,我推荐两款调色板 moreland.pltjetmap.plt,前者是Kenneth Moreland给出的调色文件,做天然地震的应该很熟悉这个调色板。后者是我根据Matlab的colormap中jet模式写的相应的RGB调色文件。 两者绘图效果如下:

2. 如何调用新的调色文件

我给palette变量添加了loadjloadm两个选项。通过定义palette='loadj',则执行load "jetmap.plt" ;通过定义palette='loadm',则执行load "moreland.plt" 。前提是这两个调色文件在你的当前路径或者在gnuplotLOADPATH中。

module的调用

关于module的编译、链接调用,请参看my personal makefile modulefortran 子程序及其封装

download

  1. 《Gnuplot in Action 2》
  2. gplot_v4.2.tar.gz
  3. gnufor2_marscfeng.f90
  4. moreland.plt
  5. jetmap.plt