本帖最后由 小明同学 于 2017-4-11 23:46 编辑
画图是理工科工作者的必备技能,
也许你已能用它们熟练地画出美美的tif,jpg,bmp或者emf等格式的图片。
确实,以此用于发论文或写结题报告都应该已经够用了。
但是别忘了:无论毕业以后是继续学术、还是去企业上班,都可能会遇到各种需要做报告的情况。
比如毕业答辩、比如部门总结汇报、比如招标投标竞争……
这时候,如果能在做报告的PPT 里面插入这样一副图:(各参数随时间的演化)
或者这样的动图:(随时间的增加,两根曲线或多根曲线的交点变化情况)
或者这样:
是不是瞬间感觉自己的报告高大上起来?
没错,看到你秀出来会动的曲线图之后,慧眼识才的领导眼前一亮、直接嘴动点赞、称许满满;中意了很久的男神女神,投来了崇拜和火辣的眼神;远处曾经嚣张的竞争对手一脸的失落,自叹技不如人在墙角默默流泪。
要的就是这种碾压的效果。(ps, 以上情景纯属歪歪,若无雷同,概不负责…)
效果好是好,可问题是:
(1) 用什么方法能画出这样的图?
(2) 画这种图会不会很麻烦?
麻不麻烦取决于你用什么样的工具。
比如,如果打算采用Matlab ,虽然用它自带的诸如movie2avi等函数也可以实现,但是效果并不见得很好。
再比如,如果打算用Flash 做动画,那么就是高射炮打蚊子。
这里,隆重推荐今天的主角——gnuplot。
1. gnuplot的基本概念
把gnuplot看成gunplot的童鞋,你阅读速度有点略快啊。也许你最近有点焦虑、烦闷?别着急,一切都会好起来的。
gnuplot 画出来的静态图长这样:
gnuplot 是一个免费软件,可以在window ,linux ,mac 等系统下使用。
它使用交互式介面,可以绘制数学函数2D或者3D图形,也可以从纯文字档读入数据、绘制统计图表等等,还包含数学计算、拟合等功能。
对于用惯了鼠标的童鞋而已,这里可能有个坏消息:gnuplot 是基于命令行的交互式绘图软件。
打开一个终端,输入gnuplot ,随着程序启动,会出现下面的信息:(如果是在Windows 电脑上,双击gnuplot.exe 后会自动打开一个命令行窗口)
不过不用太慌张,零基础的童鞋对照教程,大概只用不到半天的时间就能学会(教程在后面会提到)。
2. 简单的例子
采用gnuplot 画动态曲线图的原理是:多次画图并把所有图片压缩成一个gif动画。具体可使用reread 命令或者do for 命令。
下面是一些动图的例子和代码,其它简单的曲线可以此类推:
(1) 随时间衰减的分布曲线图
set term gif animateoptimize delay 2 size 480,360 set output 'movie.gif'
do for [i = 0:400 ] { t=i*0.02 plot sqrt(1/(1+t*t))*exp(-(x-t)**2/(1+t*t)) lw 2 }
set out set terminal wxt enhanced
(2) 等高线及其二维投影随时间变化图
#set term gif animate optimize delay 10 size 480,480 #set output 'movie.gif'
set pm3d at b set xr[-5:10] set yr[-5:10] set zr[0:1] set cbr[0:1] set isosamples 50
dofor [i = 0:50 ] { t=i*0.05 splot sqrt(1/(1+t*t))*exp(-(x-t)**2/(1+t*t))*sqrt(1/(1+t*t))*exp(-(y-2*t)**2/(1+t*t)) }
#set out #set terminal wxt enhanced
(3) 小行星轨迹图
#set term gif animate optimizedelay 5 size 960,720 #set output 'movie.gif'
set param set size ratio -1 set samples 10000
e = 1 omega=0.1
set tr[1:600] do for [i = 1:200 ] { plot e*cos(omega*t)/sqrt(t), sin(omega*t)/sqrt(t) set label 1 pointpt 7 ps 3 at e*cos(omega*i*3)/sqrt(i*3),sin(omega*i*3)/sqrt(i*3) }
#set out #set terminal wxt enhanced
(4) 两颗行星互相缠绕,最后坠毁在一起
set param set samples 10000 set tr[0.01:1] imax=100 tmax=20e0*pi ht=tmax/real(imax)
#set term gif animate optimizedelay 6 size 600,600 #set output 'orbit.gif'
do for [i=1:imax] { th(t,i)=t*real(i)*ht plot 10e0*sin(th(t,i))/th(t,i),10e0*cos(th(t,i))/th(t,i) , \ 10e0*sin(th(t,i)-pi)/th(t,i),10e0*cos(th(t,i)-pi)/th(t,i) lt 1 lc 2 }
#set out #set terminal wxt enhanced
3. 复杂的例子
除了上面正经的动态曲线图,gnuplot还可以用来干一些不正经的事情。比如:
(1) 巫婆带着乌鸦海上飞
(2) 超级马里奥从洞里钻出来
(3) 电磁炮
(4) 时钟
(5) 骑摩托车上下坡
(6) 跳舞的星星
看到这里,是不是觉得这小软件还有那么点意思?教程、软件、以及例子,可在公众号对话框界面回复gnuplot获取。
画动态曲线图的技术,你值得拥有。
转载自:科研充电宝
|