文档章节

Matlab绘图总结1

尘中远
 尘中远
发布于 2016/05/12 23:50
字数 3714
阅读 37
收藏 0
点赞 2
评论 0

Matlab绘图总结1

ps.此文由matlab自动生成

Contents

  • 概述
  • 2D绘图plot
  • 设置标题,xy轴标签及网格
  • 改变图形窗口背景
  • 绘制多个曲线在一个图上
  • 改变线形及标记
  • 坐标轴(axis)控制
  • 图例 legend
  • 双坐标轴图形绘制 - plotyy

概述

matlab有着比较强的绘图功能,在进行计算后处理时,使用matlab绘图有着origin等绘图软件无法比拟的优点。但matlab需要比较多的代码编辑,导致许多人宁愿使用origin也不用matlab。 实际上,在科学制图领域,matlab并不出众,特别在美化方面,需要比较多的代码(如果需要看看哪个科学绘图适合你可以参考下面这个链接:http://www.zhihu.com/question/21664179 ) ,但由于matlab脚本简单易懂,且普及度比较高,因此在学术界目前还是占据着绝大部分的市场。下面专门对matlab的2D,3D绘图进行总结,后面还将介绍如何美化matlab的图形。(PS.你现在看的这篇文章也是用matlab生成的) copy一段回答:

  • 工科生说Matlab完爆其他
  • 数学系的说Mathematica高贵冷艳
  • 统计系的说R语言作图领域天下无敌
  • 计算机系的说Python低调奢华有内涵
  • 生物狗说Graphpad和Origin脑残都会用``````
  • 外行说EXCEL就够了...
  • 艺术系说你把我画板拿给我......
  • 都会的天下无敌....

在介绍下面内容的时候,先准备一些数据,下面的绘图都会以这些数据来进行绘制。

clc;
clear all;
close all;
x = 0:0.1:10;
y1 = 2*sin(x)+0.1;
y2 = x.*y1;
y3 = cos(x)./(x+0.1);
y = [y1;y2;y3];
marker_style = {'>';'<';'s';'o';'d';'v';'p';'^';'*';'+';'x';'h'};
line_style = {'-';'--';':';'-.'};

2D绘图plot

2d绘图最多的莫过于plot。

函数格式:plot(x,y) 其中x和y为长度相同坐标向量。

figure
plot(x,y1);


方便简单两句搞定,figure用于新建一个绘图窗口,通过这个窗口,可以进行一些设定,plot会自动依附于最近的绘图窗口上。

plot函数有许多重载,第三个参数可以通过文本设置线形和颜色,线形颜色的简单设置可以通过第三个参数完成,复杂的设置可以通过plot第三个参数之后的参数进行指定。

设置标题,xy轴标签及网格

  • 给plot添加x轴标签,y轴标签,标题,有些时候为了更清晰明了的监控,还需要显示网格

xlabel,ylabel,title函数分别用于给x轴添加标签,y轴添加标签,及图片标题;如果不需要在里面输入函数及控制粗体斜体什么的,直接输入字符串即可,grid on即可显示网格,若不想显示, 可以使用grid off,注意gridon函数需要在plot之后调用,因为grid需要根据坐标轴情况来显示网格, 如果在plot之前,grid还不知道坐标轴的分布。具体例子如下:

figure
plot(x,y1);
grid on
xlabel('x轴');
ylabel('y轴');
title('标题');


但是如果希望在x轴,y轴的标签显示更丰富,这时候就可以使用latex,例如我要在x轴标签上显示公式,可以设置Interpreter属性为LaTex
具体见下例:
figure
plot(x,y1);
grid on
ylabel('$2\sin (x) + 0.1$','Interpreter','LaTex');
title('$\int {x\cos (\sqrt {{x^2}} )} $','Interpreter','LaTex');
xlabel('$\sum {{x^2}}  + \int {ydt}$','Interpreter','LaTex');


改变图形窗口背景

虽然很方便的画出了图,但大家都不会觉得这幅图好看,灰色的背景,白色的底纹,无论如何也不能放到论文什么的里面,大大的灰色区域让图片和白色的纸张有就像有一层深深的隔阂。 matlab中,有个功能非常强大的函数set,它可以设置句柄的属性。 当前图像的句柄可以直接用gca获取,因此,要改变当前图形窗口的背景只需要如下例中set(gcf,'color','w');即可:

figure
set(gcf,'color','w');
plot(x,y1);
grid on
xlabel('x轴');
ylabel('y轴');
title('标题');

通过此函数可以控制非常多的属性,gcf是figure生成的窗口的句柄,有三个句柄获取函数是经常使用的:

  1. gcf返回当前Figure对象的句柄值
  2. gca返回当前axes对象的句柄值
  3. gco返回当前鼠标单击的句柄值,该对象可以是除root对象外的任意图形对象,并且Matlab会把当前图形对象的句柄值存放在Figure的CurrentObject属性中。

在绘图里gcf和gca句柄经常用到。

另外,下面这个函数在出图时经常使用:

set(gcf,'unit','normalized','position',[0.2,0.3,0.4,0.2]);

此函数的功能是自动调整绘图窗口的大小,上面语句是控制绘图窗口(figure)左下角在屏幕上的显示位置是以(0.2,0.2)为原点(屏幕尺寸的原点也为左下角),窗口长0.4,宽0.2。 通过这个函数,能方便统一的生成一个统一尺寸的图,且不用每次都手动调整。上例代码改成如下:

figure
set(gcf,'color','w');
plot(x,y1);
grid on
xlabel('x轴');
ylabel('y轴');
title('标题');
set(gcf,'unit','normalized','position',[0.2,0.2,0.4,0.2]);


可以看到,图片的尺寸有明显改变。

下面开始介绍几个最长用到的设置

绘制多个曲线在一个图上

当一个图上有多条曲线时,连续调用两次plot会发现只能显示最后一次调用的结果,若希望多条曲线能都绘制在一个图上,只需要hold on命令即可

figure
set(gcf,'color','w');
plot(x,y1);
hold on
plot(x,y2);
grid on
xlabel('x轴');
ylabel('y轴');
title('标题');



改变线形及标记

许多时候,在一张图上绘制多个曲线时,需要给每个线形设置不同的线形和标记,在“概述”的初始化数据代码中, marker_style是所有的标记样式,line_style是所有的线形样式。两者组合起来,可以绘制种类繁多的线形

figure
set(gcf,'color','w');
x_temp = 1:10;
hold on
for i=1:length(marker_style)
    y_temp = ones(1,10);
    y_temp = y_temp .* i;
    plot_style = strcat('-',marker_style{i,1});
    plot(x_temp,y_temp,plot_style);
    text(x_temp(end)+0.5,y_temp(end),plot_style);
end


上代码中strcat是合并字符串函数,和c语言的一模一样。c里面的字符串操作函数在matlab里都有对应的函数, 其中最常用的莫过于格式化函数sprintf,如果使用sprintf,plot_style =strcat('-',marker_style{i,1});将写成:

plot_style = sprintf('-%s',marker_style{i,1});

设置线形及标记有四个属性经常用到分别是:

  • LineWidth 设置线宽
  • MarkerEdgeColor 设置标记的边框颜色
  • MarkerFaceColor 设置标记的内部天策颜色
  • MarkerSize 设置标记的尺寸
figure
set(gcf,'color','w');
x_temp = 1:10;
hold on

for i=1:length(marker_style)
    y_temp = ones(1,10);
    y_temp = y_temp .* i;
    plot_style = strcat('-',marker_style{i,1});
    marker_color = [rand rand rand];%获取一个随机颜色
    handel_plot = plot(x_temp,y_temp,plot_style,'LineWidth',2,...
                        'MarkerEdgeColor',[rand rand rand],...
                        'MarkerFaceColor',marker_color);
    set(handel_plot,'MarkerSize',8);
    set(handel_plot,'color',marker_color);%设置线的颜色和marker的颜色一致
   text(x_temp(end)+0.5,y_temp(end),plot_style);
end


上代码中把plot返回的句柄记录下来,用于设置属性。上例使用了两种方法设置属性,一种是set函数, 另外一种是直接在plot的第四个参数开始进行指定名称的设置,在'MarkerFaceColor'之后还可以一直延续下去, 不过我更喜欢用set函数进行设置,因为matlab的换行的那三个点实在不喜欢……

figure
set(gcf,'color','w');
x_temp = 1:10;
hold on
for i=1:length(line_style)
    y_temp = ones(1,10);
    y_temp = y_temp .* i;
    handel_plot = plot(x_temp,y_temp,line_style{i,1},'LineWidth',2);
    text(x_temp(end)+0.5,y_temp(end),line_style{i,1});
end
ylim([0 5]);


坐标轴(axis)控制

有时候,坐标轴并不是我们需要的范围里显示,那么就需要对坐标轴进行设置。

axis([xmin xmax ymin ymax zmin zmax])

若没有z轴,可以不用写z轴范围

axis函数可以设置坐标轴显示范围,其调用格式为:

  • axis equal:纵、横坐标轴采用等长刻度。
  • axis square:产生正方形坐标系(缺省为矩形)。
  • axis auto:使用缺省设置。
  • axis off:取消坐标轴。
  • axis on:显示坐标轴。

若想单独设置x轴或y轴范围,可以使用xlim,ylim函数

xlim([xmin xmax])

ylim([ymin ymax])

figure
set(gcf,'color','w');
plot(x,y1);
xlim([2 8]);
ylim([0 3]);
xlabel('x轴');
ylabel('y轴');
title('标题');


改变坐标轴显示数值,可以通过改变xtick,ytick属性来实现:

set(gca,'xtick',x_tick);
set(gca,'ytick',y_tick);

x_tick用于定义需要显示的范围向量,如想x轴从1到10,每隔0.5显示一个,那么x_tick就写成[1:0.5:10],如果1之前还有数据或者10之后还有数据都将不会显示

改变坐标轴的文字显示可以通过改变XTickLabel,YTickLabel实现:

set(gca,'XTickLabel',x_label);
set(gca,'YTickLabel',y_label);

x_label,y_label是对应要显示的字符串cell。需要注意的是这个cell的长度需要和上面x_tick的长度对应起来,例如x_tick设置为

[0,1,2,3,4]

而x_label设置为

{'零''一''二'}

前面的0,1,2将会替换为'零','一','二',但到后面的“3,4”,没有替换内容时,matlab会自动又从cell的第一个开始,既“3,4”将被替换为'零','一'。 看看下面这个例子:

figure
set(gcf,'color','w');
plot(x,y1);
grid on
xlabel('x轴');
ylabel('y轴');
title('标题');
x_tick = [1:2:10];
set(gca,'xtick',x_tick);
set(gca,'ytick',[-2:1:3]);
for i=1:length(x_tick)
    x_label{i,1} = sprintf('%.3fπ',x_tick(i)/pi);
end
set(gca,'XTickLabel',x_label);
set(gca,'YTickLabel',{'负二','负一','零','一','二','三'});


由于XTickLabel属性的长度需要和xtick设置的对应,因此,通常XTickLabel在xtick之后设置。

这个函数经常用于显示x轴为时间格式的内容。

图例 legend

如果有许多线,为了对每个线所代表的含义加以描述,就需要添加图例进行说明,此时需要用到函数legend legend函数需要每个线条的句柄和对应的文字作为输入,因此plot返回的句柄一定要记录下来

figure
set(gcf,'color','w');
size_y = size(y);
hold on
x_temp = x(1:2:end);
y_temp = y(:,1:2:end);
for i=1:size_y(1)
   plot_style = strcat('-',marker_style{i,1});
   handle_plot(i) = plot(x_temp,y_temp(i,:),plot_style);
   set(handle_plot(i),'color',[rand rand rand]*0.85);%乘以0.85是为了随机颜色更深一点
   set(handle_plot(i),'lineWidth',2);
   text_legend{i} = sprintf('曲线%d',i);
end
legend(handle_plot,text_legend,0);
grid on
xlabel('x轴');
ylabel('y轴');
title('标题');


此例中,text_legend 和plot_handle用于保存句柄和文字,由于matlab中文字用向量连接会自动合并,因此,这里文字需要用cell来存储

legend默认是右上角,若需要控制位置,可以在legend的第三个参数设置。

legend(plot_handle,text_legend,0);

代表图例放置在右下,数值可以从0到4,还有-1,他们的含义是:

  • 0:自动把图例置于最佳位置,即和图中的曲线重复最少,此时,没改变一次大小,图例都会重新选择一次最佳位置;
  • -1:置于坐标轴外面的右上角;
  • 1:置于图形右上角,为默认值;
  • 2:置于图形左上角;
  • 3:置于图形左下角
  • 4:置于图形右下角

图例也可以支持latex,和title,xlabel,ylabel原理一样,只需要设置'Interpreter'属性即可, 但不同的是,legend的Interpreter属性不能直接在函数legend中设置, 要获取legend的文字内容句柄,才能进行设置。可以使用findobj函数,可以找到已知句柄的子句柄。 因此,为了能控制legend内容,需要把legend函数返回的句柄记录下来

figure
set(gcf,'color','w');
size_y = size(y);
hold on
x_temp = x(1:2:end);
y_temp = y(:,1:2:end);
for i=1:size_y(1)
   plot_style = strcat('-',marker_style{i,1});
   handle_plot(i) = plot(x_temp,y_temp(i,:),plot_style);
   set(handle_plot(i),'color',[rand rand rand]*0.85);%乘以0.85是为了随机颜色更深一点
   set(handle_plot(i),'lineWidth',2);
   text_legend{i} = sprintf('%10d',i);
end
handel_legend = legend(handle_plot,text_legend,0);
for i=1:size_y(1)
    handel_temp = findobj(get(handel_legend,'Children'),'String',sprintf('%10d',i));
    text_latex = ['$\int {\sqrt {{x^' num2str(i) '}} } dt$'];% 生成一个latex公式
    set(handel_temp,'String',text_latex,'Interpreter','LaTex');
end
grid on
xlabel('x轴');
ylabel('y轴');
title('标题');


为了查找子句柄方便,需要给每个内容设置唯一的文字,然后通过文字查找,例子中为每个线形设置了一个序号, 并设定占位10字符(设定占位符是为了让legend的边框足够宽广,包下公式),关于latex的更详细内容可参考:

http://wenku.baidu.com/link?url=KoXelY5LJEWErxngVI1OgNGHMR4r8Lk701MLE-US9bFFjOE-0I5LuqKVAJL-3evIlq8QDvwYL5AB_FiIkmILF0ZhTNKbHVHGoVSGMvWUIdq

双坐标轴图形绘制 - plotyy

有时需要绘制两个变量在一个图上,但这两个变量的范围又差距很大,如一个可能是几百数量级的, 另一个可能是几十数量级的,这时候,用传统的hold on绘制出来的图线,低数量级的图线很难看清, 因此,需要给两个参数不同的坐标范围,matlab里面plotyy函数就是实现此功能。

figure
y_temp = y2.*1000;
[AX H1 H2] = plotyy(x,y1,x,y_temp);
grid on;
xlabel('x');
set(gcf,'color','w');


例子中[AX H1 H2]的作用非常重要,如果需要改变图形属性,他们是必不可少的。 对于plotyy来说,比较麻烦的是其属性的设置,由于有两个坐标系,因此在绘制时需要把两个坐标系及图线的句柄保存, AX保存了两个坐标轴对应的句柄AX(1)是左坐标,AX(2)是右坐标,H1和H2保存了两个图线的句柄。

为了设置坐标轴的文字,需要获取坐标轴的标签句柄,再设置,如下例子中的set(get(AX(1),'Ylabel'),'string','y1');既是把ax1对应的文字改为y1。 设置坐标轴的颜色直接改变坐标轴句柄的XColor和YColor属性,设置线条属性和plot函数一样。 效果见下例子:

figure
[AX H1 H2] = plotyy(x,y1,x,y_temp);
grid on
xlabel('x');
set(gcf,'color','w');
set(AX(1),'Xaxislocation','top');%把第一个数据的x轴提升到顶部
set(get(AX(1),'Xlabel'),'string','x1');%设置y1对应坐标轴内容
set(get(AX(1),'Ylabel'),'string','y1');%设置y1对应坐标轴内容
set(get(AX(2),'Xlabel'),'string','x2');%设置y2对应坐标轴内容
set(get(AX(2),'Ylabel'),'string','y2');%设置y2对应坐标轴内容
set(AX(1),'XColor','r','YColor','r');%设置y1对应x,y轴颜色
set(AX(2),'XColor','b','YColor','b');%设置y2对应x,y轴颜色
set(H1,'color','r');%设置y1线颜色
set(H2,'color','b');%设置y2线颜色
set(H1,'LineWidth',2);%设置y1线线宽
set(H2,'LineWidth',2);%设置y2线线宽


例子中Xaxislocation属性用于设置轴的位置

文章生成代码及绘图代码下载: http://download.csdn.net/detail/czyt1988/7770365



© 著作权归作者所有

共有 人打赏支持
尘中远
粉丝 1
博文 26
码字总数 47436
作品 0
朝阳
程序员
基于 Python 的图表绘图系统--matplotlib

matplotlib,风格类似 Matlab 的基于Python的图表绘图系统。 matplotlib 是 Python 最著名的绘图库,它提供了一整套和 matlab 相似的命令 API,十分适合交互式地进行制图。而且也可以方便地将...

匿名
2010/05/23
20K
1
Octave 3.8.0 发布,数学软件包

Octave 3.8.0 发布,这是个主版本更新,包括一个试验的 GUI(允许使用 --force-gui 选项);默认使用 OpenGL 制图来替代之前的 gnuplot;支持 Named exceptions;各种 Matlab 兼容性改进和 ...

oschina
2014/02/13
1K
1
接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点

阅读目录 1.前言 2.Matlab的简单介绍 3.Matlab开发环境介绍 4.那些常见的命令 5.不得不说的矩阵操作 6.编程语法 7.关于Matlab我想说的话   不记得上一次写超过20行的matlab程序是什么时候了...

老朱第八
2017/11/11
0
0
matlab基本操作和语法

1.前言 准确的说这篇文章不是给完全的编程新手,特别是以前没有过一定编程经验的人准备的。 文章的适合对象是:已经有一定编程基础的人,如果你想用Matlab来快速的完成算法验证,以及科研学术...

NORTHhan
2016/04/22
0
0
GNU Octave 4.2 发布,数学软件包

GNU Octave 4.2 发布了,Octave 是一个类似 matlab 和 Scilab 的数学软件包,可以进行各种运算,编程。它还有丰富的 C++ 接口可以让用户编程时调用。它绘图使用 gnuplot。 Octave 的使用也是...

王练
2016/11/17
1K
1
数学软件包 GNU Octave 3.4.0 发布

Octave 是一个类似matlab和Scilab的数学软件包,可以进行各种运算,编程。它还有丰富的C++接口可以让用户编程时调用。它绘图使用gnuplot。 Octave的使用也是基于字符终端模式的,当需要绘图时...

红薯
2011/02/11
1K
1
观点 | 为什么我对MATLAB情有独钟

  选自Medium   作者:Christopher Madan   机器之心编译   参与:路雪、黄小天      本文作者 Christopher Madan 喜欢用 MATLAB 编程,尽管他是一个认知心理学家/神经科学家,编...

机器之心
2017/12/04
0
0
理工科常用的学习工具

理科学习中要是有一些工具能够帮助我们,那我们的学习生活将会有如神助!学习效率将会大大提高!有了这些学习工具,数学物理化学这些个老大难的问题,都可以被我们攻克了。下面罗列了一些学习...

学术研究软件
2016/10/12
21
0
用MATLAB绘制的一个单词“LOVE”的图像

APEC放假最后一天啦,在家里鼓捣MATLAB,突然想到用MATLAB里的函数图像画一个好玩的东西。想来想去,就画成了这个样子: 这个图像是由以下四个方程的图像构成的 1)y=1/(x+4.5)-4.5 2)((x+2...

北风其凉
2014/11/12
0
0
数学软件包--Octave

Octave 是一个类似matlab和Scilab的数学软件包,可以进行各种运算,编程。它还有丰富的C++接口可以让用户编程时调用。它绘图使用gnuplot。 Octave的使用也是基于字符终端模式的,当需要绘图时...

匿名
2008/11/15
36.9K
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

eclipse SVN 项目重新定位

SVN 重新定位 1.方法一 首先:在Eclipse中选择Windows-> Show View->others 就会出现【SVN资源库/SVN Repositories】,选中后,点击确认; 然后:选中原有的地址,选择【重新定位/Relocate】...

qimh
12分钟前
0
0
Linux 第29课 ——Linux集群架构(下)

Linux集群架构(下) 八、DR模式搭建 8.1 准备工作 试验需求三台机器: 分发器,也叫调度器(简写为dir) 192.168.112.136 ying01 rs1 192.168.112.138 ying02 rs2 192.168.112.139 ying03 vip...

feng-01
17分钟前
0
0
轻松搭建svn版本管理工具+svnmanager管理客户端

前面的文章有写过svn版本管理工具的安装是基于svn的安装包进行安装,对于svn与apache的结合还得下svn和apache的模块进行结合过程比较繁琐,今天来介绍下通过centos的yum来安装svn能够快速安装...

javazyw
26分钟前
0
0
keepalived配置高可用集群

Linux集群概述 根据功能划分为两大类:高可用和负载均衡 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 实现高可用的开源软件有:...

TaoXu
32分钟前
0
0
mysql联表批处理操作

1 概述 mysql中的单表增删改查操作,可以说是基本中的基本. 实际工作中,常常会遇到一些基本用法难以处理的数据操作,譬如遇到主从表甚至多级关联表的情况(如一些历史问题数据的批量处理),考虑到...

社哥
35分钟前
0
0
IntelliJ IDEA 详细图解最常用的配置,适合刚刚用的新人。

刚刚使用IntelliJ IDEA 编辑器的时候,会有很多设置,会方便以后的开发,磨刀不误砍柴工。 比如:设置文件字体大小,代码自动完成提示,版本管理,本地代码历史,自动导入包,修改注释,修改...

kim_o
49分钟前
0
0
Google Java编程风格指南

目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义。当且仅当一个Java源文件符合此文档中的规则, 我们才认为它符合...

niithub
51分钟前
0
0
java.net.MalformedURLException异常说明

1.异常片段 Java代码中,在进行URL url = new URL(urllink)操作时,提示以下异常信息,该类异常主要问题出在参数urllink上面。 异常片段1 java.net.MalformedURLException at java.ne...

lqlm
52分钟前
1
0
CentOS7修改mysql5.6字符集

解决办法:CentOS7下修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家所需要的字符集,是国际编码。 具体操作如下: 1.进入MySQL [root@tianqi-01 ~]# mysql -uroot -p Enter passw...

河图再现
53分钟前
0
0
DevExpress v18.1新版亮点——WPF篇(一)

用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容。本文将介绍了DevExpress WPF v18.1 的新功能,快来下载试用新版本!点击下载>> Accordion Co...

Miss_Hello_World
56分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部