文档章节

Matalb绘图总结2

尘中远
 尘中远
发布于 2016/05/12 23:54
字数 1391
阅读 6
收藏 0

Matlab绘图总结2

Contents

概述
如何在一个数据量很大的曲线上做标记
平滑一个数据量很少的曲线
绘制面积图

概述

上篇文章介绍了简单的绘图函数,地址见: http://blog.csdn.net/czyt1988/article/details/38637725

这篇将介绍一些论文绘图中经常碰到的问题,如在一个数量很大的曲线上做标记,平滑一个数据量很少的曲线,绘制面积图,以及如何改进绘图的美感

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

如何在一个数据量很大的曲线上做标记

如果有个曲线有5000个点,为了区分多条曲线,又想给他们做标记用以区分,点数少的时候好说 ,设置Marker就可以实现,但点数多的时候却不是那么好看了。

可以看看面这个例子:

没有标记图片如下所示:

text_legend = {};
text_legend{1,1} = 'y1 = 2*sin(x)+0.1';
text_legend{2,1} = 'y2 = sin(x).*cos(x)+0.2';
text_legend{3,1} = 'y3 = sin(x)./(x+0.1)';
figure
set(gcf,'color','w');
hold on;
handle_plot = [];
handle_plot(1) = plot(x,y1,'-','color',[rand rand rand],'LineWidth',2);
handle_plot(2) = plot(x,y2,'-','color',[rand rand rand],'LineWidth',2);
handle_plot(3) = plot(x,y3,'-','color',[rand rand rand],'LineWidth',2);
grid on;
legend(handle_plot,text_legend,0);

带标记图片如下所示:

figure
set(gcf,'color','w');
hold on;
handle_plot = [];
handle_plot(1) = plot(x,y1,'-<','color',[rand rand rand],'LineWidth',2);
handle_plot(2) = plot(x,y2,'-s','color',[rand rand rand],'LineWidth',2);
handle_plot(3) = plot(x,y3,'-o','color',[rand rand rand],'LineWidth',2);
grid on;
legend(handle_plot,text_legend,0);


标记完全看不清 为了可以稀疏的标记出来,可以绘制为需要绘制marker的曲线单独绘制一个仅有marker的标记线,这个标记线取点也在数据中获取,不过 取点间隔比原始数据更大,如:

index = 1:50:length(x);

通过上面这个代码获取需要抽取的索引,相当于每隔50个点抽取一个数据。

figure
set(gcf,'color','w');
hold on;
handle_plot = [];handle_plot_Marker = [];
line_color = [rand rand rand];
handle_plot(1) = plot(x,y1,'-','color',line_color,'LineWidth',2);
handle_plot_Marker(1) = plot(x(index),y1(index),'<','color',line_color);
line_color = [rand rand rand];
handle_plot(2) = plot(x,y2,'-','color',line_color,'LineWidth',2);
handle_plot_Marker(2) = plot(x(index),y2(index),'s','color',line_color);
line_color = [rand rand rand];
handle_plot(3) = plot(x,y3,'-','color',line_color,'LineWidth',2);
handle_plot_Marker(3) = plot(x(index),y3(index),'o','color',line_color);
grid on;
legend(handle_plot_Marker,text_legend,0);

使用这种方法,无论在多的点,也能清洗的标定记号。

平滑一个数据量很少的曲线

此问题和上个问题正好相反,如果数据量特别少,又想绘制一个光滑的曲线,就需要进行平滑插值。 还是使用上面经过抽取的数据:

x0 = x(index);
y10 = y1(index);
y20 = y2(index);
y30 = y3(index);
text_legend = {};
text_legend{1,1} = 'y10';
text_legend{2,1} = 'y20';
text_legend{3,1} = 'y30';
figure
set(gcf,'color','w');
hold on;
handle_plot = [];
handle_plot(1) = plot(x0,y10,'-','color',[rand rand rand],'LineWidth',2);
handle_plot(2) = plot(x0,y20,'-','color',[rand rand rand],'LineWidth',2);
handle_plot(3) = plot(x0,y30,'-','color',[rand rand rand],'LineWidth',2);
grid on;
legend(handle_plot,text_legend,0)

从上面图可以看出,由于点数比较少,有明显的不平滑出现,为了使其平滑,可以使用3次样条插值。 matlab插值函数有很多,其中3次样条插值(spline)在曲线平滑上的表现是比较理想的(别用线性插值,无任何效果)。

matlab中插值函数为interp1,样式为:yi=interp1(x,y,xi,'spline'),x,y为原来的值,xi为需要插值的x值,yi为插值后的结果

y1i=interp1(x0,y10,x,'spline');
y2i=interp1(x0,y20,x,'spline');
y3i=interp1(x0,y30,x,'spline');

text_legend = {};
text_legend{1,1} = 'y1i';
text_legend{2,1} = 'y2i';
text_legend{3,1} = 'y3i';
figure
set(gcf,'color','w');
hold on;
handle_plot = [];
handle_plot(1) = plot(x,y1i,'-','color',[rand rand rand],'LineWidth',2);
handle_plot(2) = plot(x,y2i,'-','color',[rand rand rand],'LineWidth',2);
handle_plot(3) = plot(x,y3i,'-','color',[rand rand rand],'LineWidth',2);
grid on;
legend(handle_plot,text_legend,0);

可以看到,插值后的结果和之前的对比非常接近

绘制面积图

有时候,绘制类似于功率的图时,需要给底部某区域填充颜色,这时就需要使用填充图。

matlab里绘制面积图使用fill函数,fill(x,y,color)函数前两个参数一一对应组成一个点序列,如: x=[x1,x2,x3……xn],y=[y1,y2,y3……yn],fill函数将会从(x1,y1)点开始(x2,y2),(x3,y3)……绘制一个区域, 到(xn,yn)然后再连接(x1,y1),在这个封闭区域里填充颜色

下面这个例子给曲线1填充颜色:

text_legend = {};
text_legend{1,1} = 'y1 = 2*sin(x)+2.1';
text_legend{2,1} = 'y2 = sin(x).*cos(x)+2.2';
text_legend{3,1} = 'y3 = sin(x)./(x+0.1)+2';
figure
set(gcf,'color','w');
hold on;
handle_plot = [];
handle_plot(1) = plot(x,y1,'-','color',[rand rand rand],'LineWidth',2);
fill([x(1) x x(end)],[0 y1 0],[0.77,0.90,0.94]);
handle_plot(2) = plot(x,y2,'-','color',[rand rand rand],'LineWidth',2);
handle_plot(3) = plot(x,y3,'-','color',[rand rand rand],'LineWidth',2);
grid on;
legend(handle_plot,text_legend,0);

多个图需要填充时,最好把颜色设置成有透明度,这样看起来会漂亮很多, edgealpha属性和FaceAlpha属性可以用于设置填充的边界线和填充颜色的透明度

text_legend = {};
text_legend{1,1} = 'y1 = 2*sin(x)+0.1';
text_legend{2,1} = 'y2 = sin(x).*cos(x)+0.2';
text_legend{3,1} = 'y3 = sin(x)./(x+0.1)';
figure
set(gcf,'color','w');
hold on;
handle_plot = [];
line_color = [rand rand rand];
handle_plot(1) = plot(x,y1,'-','color',line_color);
fill([x(1) x x(end)],[0 y1 0],line_color,'edgealpha',0.4,'FaceAlpha',0.4);

line_color = [rand rand rand];
handle_plot(2) = plot(x,y2,'-','color',line_color);
fill([x(1) x x(end)],[0 y2 0],line_color,'edgealpha',0.4,'FaceAlpha',0.4);

line_color = [rand rand rand];
handle_plot(3) = plot(x,y3,'-','color',line_color);
fill([x(1) x x(end)],[0 y3 0],line_color,'edgealpha',0.4,'FaceAlpha',0.4);
grid on;
legend(handle_plot,text_legend,0);

matlab还是能画出比较漂亮的图的…

ps:此blog依然由matlab的publish生成,源代码地址:http://download.csdn.net/detail/czyt1988/7864013



© 著作权归作者所有

共有 人打赏支持
尘中远
粉丝 1
博文 26
码字总数 47436
作品 0
朝阳
程序员
【图像处理知识复习】01画灰度直方图matlab, C++ 实现

灰度直方图是对图像中灰度级分布的统计,横坐标为灰度值,纵坐标是像素个数(也可以采用当前像素值个数占总像素个数的百分比)。这里直接统计个数。 1. matalb代码如下: %画灰度直方图 %1, ...

jizhidexiaoming
05/07
0
0
iPhone图形开发绘图小结

iPhone图形开发绘图教程是本文要介绍的内容,介绍了很多关于绘图类的使用,先来看详细内容讲解。 1、绘图总结: 绘图前设置: 绘图后设置: 注: 画完图后,必须 先用CGContextStrokePath来描线,...

junwong
2012/03/01
1K
0
Android View 绘图流程

View 绘图流程 API 和 Displayer View -> Draw -> Canvas -> C API -> OpCode Byte -> IO -> GPU CARD -> Electronic signal -> Displayer Android提供了一套View机制,封装好了需要控件,只......

精通吹水
2016/04/20
33
0
关于opencv下bixwise_xor与matalb下bitxor运行效率的疑问

各位高人,有个问题想请教,还望解答。我刚学OPENCV,刚好用到opencv下的bitwise_xor函数,就想测试一下,该函数与matalb下的bitxor两个运行速度快慢。以下是程序: matlab code: function ...

梦石
2013/03/09
295
0
多线程总结

进入run()函数后,新线程就开始运行,有自己的堆栈。 出了run()函数后,新建的线程就结束,并会发出信号,可以在另外一个线程中捕获,然后响应。、 currentThreadId()和 currentThread()分别...

晨曦之光
2012/04/13
490
0

没有更多内容

加载失败,请刷新页面

加载更多

关于pip

我在更新pip的时候碰到的一些问题。 第一次安装,直接安装就ok了,所以也没研究,没想到后来由于安装了python2.x和python3.x之后出现了问题。 如果要将pip更新到最新版本需要指明是哪个版本的...

恰东
28分钟前
1
0
对硬盘进行分区时,GPT和MBR有什么区别

在Windows 8或8.1中设置新磁盘时,系统会询问你是想要使用MBR还是GPT分区。GPT是一种新的标准,并在逐渐取代MBR。 GPT带来了很多新特性,但MBR仍然拥有最好的兼容性。GPT并不是Windows专用的...

yizhichao
30分钟前
2
0
区块链教程btcpool矿池源码分析StratumServer模块解析

兄弟连区块链教程btcpool矿池源码分析StratumServer模块解析 核心机制总结 接收的job延迟超过60秒将丢弃 如果job中prevHash与本地job中prevHash不同,即为已产生新块,job中isClean状态将置为...

兄弟连区块链入门教程
31分钟前
1
0
JS中的异常捕获

JS中的异常捕获(目的:把抛出的错误捕获到,不让其阻断浏览器的继续执行) try{//需要执行的JS代码(可能会报错)}catch(e){//try中代码报错,会执行catch}finally{//不管try中的代...

NDweb
41分钟前
2
0
ObjectARX_AcDb2dPolyline复杂实体

1遍历:访问或者编辑复杂实体也需要通过特定的方式。 AcDb2dPolyline的顶点信息不能通过AcDb2dPolyline对象直接得到,需要遍历AcDb2dPolyline所包含的AcDb2dVertex对象: void IteratePolylin...

一个小妞
42分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部