marscfeng's gnufor2 module
Contents
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.txt
和data_file.txt
(后者会覆盖前者)。在终端可以通过$ gnuplot commond_file.txt
重复模块中相应的操作,而且还可以通过更改commond_file.txt
中的相应操作让图片绘制的更精美。当绘制多张图片想保存相应命令和数据文件时,可以通过input
参数设定输出文件名commond_file_input.txt
和data_file_input.txt
。
9. 如何让程序结束后图片窗口继续显示
定义persist
,默认图片不会持续存在,即persist='yes'
。
绘制二维平面图
call image(f,v,fv,terminal='eps',filename='fig2.eps')
1. 如何更改image的调色板
定义palette
参数,默认CMY
模式。但是包括gnuplot
包涵的几种调色板在内,我个人都不喜欢。作为一名地球物理的学生,我推荐两款调色板
moreland.plt
和jetmap.plt
,前者是Kenneth Moreland给出的调色文件,做天然地震的应该很熟悉这个调色板。后者是我根据Matlab的colormap中jet模式写的相应的RGB调色文件。
两者绘图效果如下:
2. 如何调用新的调色文件
我给palette
变量添加了loadj
和loadm
两个选项。通过定义palette='loadj'
,则执行load "jetmap.plt"
;通过定义palette='loadm'
,则执行load "moreland.plt"
。前提是这两个调色文件在你的当前路径或者在gnuplot
的LOADPATH
中。
module的调用
关于module的编译、链接调用,请参看my personal makefile module和fortran 子程序及其封装。
download
Author F. Cheng
LastMod 2016-09-30