文档章节

Matalb绘图总结2

尘中远
 尘中远
发布于 2016/05/12 23:54
字数 1391
阅读 9
收藏 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
CAD断面制图技术难点

断面技术难点总结 1. CAD绘图比例尺设置 2. CAD图形绘制 3. 数据导入 4. 其他图框内容绘制

HuangRui1991
2017/05/17
1
0
关于opencv下bixwise_xor与matalb下bitxor运行效率的疑问

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

梦石
2013/03/09
341
0

没有更多内容

加载失败,请刷新页面

加载更多

如何解决 homebrew 更新慢的问题

之前一直困扰于 Homebrew 的更新速度,曾试过修改更新源(清华、中科大等)的方式,但是并没什么卵用;也试过设置 curl 代理的方式,但是 brew 走的好像不是 curl 的方式,所以也没用。 通过...

whoru
10分钟前
0
0
TiDB EcoSystem Tools 原理解读系列(二)TiDB-Lightning Toolset 介绍

简介 TiDB-Lightning Toolset 是一套快速全量导入 SQL dump 文件到 TiDB 集群的工具集,自 2.1.0 版本起随 TiDB 发布,速度可达到传统执行 SQL 导入方式的至少 3 倍、大约每小时 100 GB,适合...

TiDB
12分钟前
0
0
【Visual Studio 扩展工具】如何在ComponentOneFlexGrid树中显示RadioButton

概述 在ComponentOne Enterprise .NET控件集中,FlexGrid表格控件是用户使用频率最高的控件之一。它是一个功能强大的数据管理工具,轻盈且灵动,以分层的形式展示数据(数据呈现更加直观)。...

葡萄城技术团队
14分钟前
0
0
Maven环境隔离

Maven环境隔离 1. 什么是Maven环境隔离 顾名思义,Maven环境隔离就是将开发中的环境与beat环境、生产环境分隔开,方便进行开发和维护。这个在实际项目中用的还是很多的,如果你的项目用的Mav...

蚂蚁-Declan
14分钟前
1
0
day182-2018-12-19-英语流利阅读-待学习

“性感”时代已去,维密将如何转身? Daniel 2018-12-19 1.今日导读 维多利亚的秘密(Victoria's Secret)这个内衣品牌,最近似乎步入了“中年危机”——曾经打遍天下的“性感”内衣,在主打...

飞鱼说编程
14分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部