黑洞视界分享 http://blog.sciencenet.cn/u/odyssey 清华大学天体物理中心副研究员

博文

Matlab画图(二):动画及文字标注

已有 17740 次阅读 2014-6-15 12:57 |个人分类:Matlab画图|系统分类:科研笔记| 动画, matlab画图, 文字标注

       俗话说“一图胜千言”。在报告中用动画来展示一些关键性内容,可以收到更好的效果,也更能吸引观众的注意力。在这里,我们介绍如何用Matlab生成一些简单的动画,以及如何在画面中添加文字标注。


(一)Matlab与动画

       Matlab中与动画有关的内容可以分为四个部分,分别是:1、生成动画;2、播放动画;3、保存动画;4、将动画转化为GIF文件。


1、生成动画

       基本的动画是由一帧帧静态画面组成的。在Matlab中生成动画的步骤并不复杂:在指定的窗口画出一帧帧画面,然后每一帧静态画面保存到一个对象列表中。基本步骤如下:

  1. 初始化一个画图窗口。例如:

    fig = figure('Position',[100,100,1200,600]);

  2. 用一个循环在窗口中画一帧帧静态图画,然后用getframe()函数将画面保存到对象列表M中。例如:

    for ii=1:FM

       subplot(1,2,1);

       % Draw light curves here.

       .......   % Codes of drawing are listed here.


       subplot(1,2,2);

       % Draw the spectrum of the signal. 

       .......   % Codes of drawing are listed here.


       % Save the frame

       M(ii) = getframe(fig);

    end

2、播放动画

       在生成动画的过程中,每一帧画面所用的时间长短不一,往往看不出实际的动画效果。因此,完成动画之后,我们可以用Movie()函数将动画按设定的参数播放出来,看看实际的效果。下面是一个实际的代码例子:

close all;   % 关闭现有的画图窗口。

[h, w, p] = size(M(1).cdata);  % 获得动画的尺寸。

hf = figure('Position',[100 100 w h]);  % 生成一个新的图像窗口,用来显示动画。

movie(hf,M,1,30);   % 按每秒30帧的速度播放动画1次。


3、保存动画

       动画的保存使用Matlab内置函数movie2avi()。例如:

movie2avi(M, 'Noiseless.avi', 'compression', 'None');

其中M为前面生成的动画对象;第2个参数为文件名;第3、4个参数用来选择视频的压缩格式,在Windows操作系统中可以使用‘Indeo5’压缩格式,最后生成文件尺寸较小,而在Unix和MacOS下面只能使用‘None’,即无压缩格式,生成的文件尺寸比较大。


4、将动画转化为GIF文件

       movie2avi()生成的是AVI格式视频文件,需要用专门的软件才能播放。为了能够在网页或PPT报告中直接显示动画,我们建议将动画转化为GIF文件。这里,我们从网上收集了一个能将AVI视频转化为GIF文件的Matlab程序avi2gif(),放在附录中。该程序使用交互式用户界面,使用起来相当方便。

图1:示例动画。显示一段时间序列信号及其频谱。


(二)Matlab中图像的标注

       正如上面的示例动画所显示的那样,有时候我们需要在图像中标注一些文字,以便于读者理解图像的内容。在Matlab中可以使用内置函数annotation()。annotation()可以有多种文字、图形标注方式,下面例举其中的“文字标注”和“文字加箭头标注”进行说明。


1、文字标注

str = 'x(t) = Sin(2pi*F1*t)+Sin(2pi*F2*t)';

annotation('textbox', [.18 .8, .1, .1], 'string', str, 'fontsize', 20, ...

     'color', 'm', 'edgecolor', 'none');

在这段代码中,[.18 .8 .1 .1]为文字的在窗口中的绝对位置,所使用的是绝对坐标,[0 0]表示绘图区域的左下角,[1 1]表示绘图区域的右上角。显示效果参考图1中的左图。在这里,因为X坐标的范围不断在变化,因此使用绝对坐标比较方便。


2、文字加箭头标注

   [ax1,ay1] = dsxy2figxy(gca, XFreq1, YFreq1);

   strf1 = ['F1=' num2str(Freq1)];

   strf2 = ['F2=' num2str(Freq2)];

   har1 = annotation('textarrow',ax1,ay1, 'color', 'm', ...

       'fontsize', 20, 'String', strf1, 'textcolor', 'm', 'linewidth', 2);

   [ax2,ay2] = dsxy2figxy(gca, XFreq2, YFreq2);

   har2 = annotation('textarrow',ax2,ay2, 'color', 'm', ...

       'fontsize', 20, 'String', strf2, 'textcolor', 'm', 'linewidth', 2);

在这段代码中,显示了两个“文字加箭头”标注,其效果参见图1中的右图。在这里为了标注方便,我们输入的是相对坐标(XFreq1,YFreq1),但是annotation()函数只支持绝对坐标,因此,我们需借助Matlab中一个坐标转化函数dsxy2figxy()将相对坐标转化为绝对坐标。必须注意的是这个函数并不是Matlab内置函数,使用前需用命令"addpath([docroot '/techdoc/creating_plots/examples'])"将相关的目录导入至Matlab的命令搜索路径。


附录:

示例程序:FIR_Noiseless_Demo.m

视频转化工具:avi2gif.m



https://blog.sciencenet.cn/blog-3854-803431.html

上一篇:实验数据分析中的相关系数与相关性
下一篇:参观华盛顿航空航天博物馆(一)
收藏 IP: 166.111.26.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-24 14:10

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部