MATLAB折线消除锯齿平滑

[复制链接]
竹中籽 发表于 2013-6-12 10:39:52

MATLAB学习实战:深入剖析Figure的属性
很多人使用MATLAB是因为它具有强大的图形绘制功能,相比于C++,绘制二维或三维图形MATLAB简单到不用怎么去学习这门语言,只需要把数据导入,再从help的demo里copy几句话就可以轻松搞定。有过用C++绘制二维图形经历的人,一旦使用过MATLAB的绘图功能就会体会到这真是——神器。废话少说,今天的重点就是要分析MATLAB中Figure的各个属性,以及其含义(由于属性项目很多,这里只是介绍我感兴趣的几项,具体的可以参考MATLAB的The Properties of Figure/Axis/Line series)。
【问题】
MATLAB虽然可以方便地绘制出各种图形,但是对于二维的图形,会有锯齿,比较“难看”,怎么消除这些锯齿,让其看起来光滑些(Python/R等绘制的折线就比较光滑)?


【回答】
查阅了网上资料,发现要消除MATLAB的锯齿(使折线看起来比较平滑)有三种解决方法:
(1)      使用外部工具包/函数,如export_fig,在MATLAB File Exchange网站上有下载。利用这些函数可以把Figure保存为矢量和栅格格式,而且折线看起来比较光滑。把图1用export_fig导出为png图像,效果如下图所示:
       相比于最初的图形,可以到折线平滑了许多,而且TickLabel加粗了一些,但是也可以发现图形的边框颜色有点儿太淡了,下面给出一个更好的方案-3!
(2)      对于高版本的MATLAB可以采用HG2模式,打开HG2模式的命令:feature(‘hg2’, ’on’);其实不要小看MATLAB。其实MATLAB隐藏了一个非常强大的绘图模式HG2。这个模式平时是隐藏的,只能在MATLAB启动时通过附加参数的形式开启,即可以将MATLAB的快捷方式中的指向目标由"...\...\MATLAB\R2013a\bin\MATLAB.exe"改为"...\...\MATLAB\R2013a\bin\MATLAB.exe"-hgVersion 2
(3)      不借组任何外面函数或HG2(我在R2011b上测试HG2模式,折线虽然有一定程序的平滑但是效果不是很明显),采用Figure中的LineSeries属性LineSmoothing进行折线的平滑,效果很好。下面进行实战测试。
【实战】
对于一个Figure,其包含了众多的属性,要想绘制出理想、漂亮的、符合自己要求的图形,了解这些属性的含义具有重要作用。一个Figure的属性有:

%  get(gcf)
Alphamap = [ (1 by 64) double array]
         CloseRequestFcn = closereq
         Color = [1 1 1]
         Colormap = [ (64 by 3) double array]
         CurrentAxes = [174.004]
         CurrentCharacter =
         CurrentObject = []
         CurrentPoint = [0 0]
         DockControls = on
         FileName =
         IntegerHandle = on
         InvertHardcopy = off
         KeyPressFcn =
         KeyReleaseFcn =
         MenuBar = figure
         Name =
         NextPlot = add
         NumberTitle = on
         PaperUnits =centimeters
         PaperOrientation =portrait
         PaperPosition =[3.06683 9.27982 14.8054 11.1041]
         PaperPositionMode =manual
         PaperSize = [20.98429.6774]
         PaperType = A4
         Pointer = arrow
         PointerShapeCData = [(16 by 16) double array]
         PointerShapeHotSpot =[1 1]
         Position = [451 185 560 420]
         Renderer = painters
         RendererMode = auto
         Resize = on
         ResizeFcn =
         SelectionType = normal
         ToolBar = auto
         Units = pixels
         WindowButtonDownFcn =
         WindowButtonMotionFcn=
         WindowButtonUpFcn =
         WindowKeyPressFcn =
         WindowKeyReleaseFcn =
         WindowScrollWheelFcn =
         WindowStyle = normal
         WVisual = 00 (RGB32  GDI, Bitmap, Window)
         WVisualMode = auto
         BeingDeleted = off
         ButtonDownFcn =
         Children = [174.004]
         Clipping = on
         CreateFcn =
         DeleteFcn =
         BusyAction = queue
         HandleVisibility = on
         HitTest = on
         Interruptible = on
         Parent = [0]
         Selected = off
         SelectionHighlight =on
         Tag =
         Type = figure
         UIContextMenu = []
         UserData = []
         Visible = on
一个Figure中需要有一个Axis对象(如果把Figure比作是画桌,那么我想Axis可以比作是画纸和画笔),Axis的属性有:
%  get(gca)
ActivePositionProperty = outerposition
         ALim= [0 1]
         ALimMode= auto
         AmbientLightColor= [1 1 1]
         Box = on
         CameraPosition= [3 0 17.3205]
         CameraPositionMode= auto
         CameraTarget= [3 0 0]
         CameraTargetMode= auto
         CameraUpVector= [0 1 0]
         CameraUpVectorMode= auto
         CameraViewAngle= [6.60861]
         CameraViewAngleMode= auto
         CLim= [0 1]
         CLimMode= auto
         Color = [1 1 1]
         CurrentPoint= [ (2 by 3) double array]
         ColorOrder= [ (7 by 3) double array]
         DataAspectRatio= [3 1 1]
         DataAspectRatioMode= auto
         DrawMode= normal
         FontAngle= normal
         FontName = Helvetica
         FontSize = [10]
         FontUnits= points
         FontWeight = normal
         GridLineStyle = :
         Layer= bottom
         LineStyleOrder= -
         LineWidth = [0.5]
         MinorGridLineStyle= :
         NextPlot = add   %repalce
         OuterPosition= [0 0 1 1]
         PlotBoxAspectRatio= [1 1 1]
         PlotBoxAspectRatioMode= auto
         Projection= orthographic
         Position= [0.13 0.11 0.775 0.815]
         TickLength = [0.01 0.025]
         TickDir = in
         TickDirMode= auto
         TightInset= [0.0464286 0.0404762 0.00892857 0.0190476]
         Title= [177.004]
         Units= normalized
         View= [0 90]
         XColor = [0 0 0]
         XDir = normal
         XGrid = off
         XLabel = [178.004]
         XAxisLocation = bottom
         XLim = [0 6]
         XLimMode= manual
         XMinorGrid= off
         XMinorTick= off
         XScale= linear
         XTick = [ (1 by 7) double array]
         XTickLabel = [0; 1; 2; 3; 4; 5; 6];
         XTickLabelMode= auto
         XTickMode= manual
         YColor = [0 0 0]
         YDir = normal
         YGrid = off
         YLabel = [179.004]
         YAxisLocation = left
         YLim = [-1 1]
         YLimMode= manual
         YMinorGrid= off
         YMinorTick= off
         YScale= linear
         YTick = [ (1 by 11) double array]
         YTickLabel = [ (11 by 4) char array]
         YTickLabelMode= auto
         YTickMode= manual
         ZColor = [0 0 0]
         ZDir = normal
         ZGrid = off
         ZLabel = [180.004]
         ZLim = [-1 1]
         ZLimMode= manual
         ZMinorGrid= off
         ZMinorTick= off
         ZScale= linear
         ZTick = [-1 0 1]
         ZTickLabel =
         ZTickLabelMode= auto
         ZTickMode= manual
         BeingDeleted= off
         ButtonDownFcn=
         Children = [ (2 by 1) double array]   % Axis包含的线对象,线对象的handles
         Clipping= on
         CreateFcn=
         DeleteFcn=
         BusyAction= queue
         HandleVisibility= on
         HitTest= on
         Interruptible= on
         Parent = [1]
         Selected= off
         SelectionHighlight= on
         Tag=
         Type= axes
         UIContextMenu= []
         UserData= []
         Visible= on
我们抽取其中一条线看看其具有哪些属性:
%  h=get(gca);
%  get(h.Children(1));
    DisplayName:''
           Annotation: [1x1 hg.Annotation]
                 Color:[1 0 0]
             LineStyle: ':'
             LineWidth: 1.5000
                Marker: 'none'
            MarkerSize: 6
       MarkerEdgeColor: 'auto'
       MarkerFaceColor: 'none'
                 XData:[1x13 double]
                 YData: [1x13 double]
                 ZData: [1x0 double]
         BeingDeleted: 'off'
         ButtonDownFcn: []
              Children: [0x1 double]
              Clipping: 'on'
            CreateFcn: []
            DeleteFcn: []
           BusyAction: 'queue'
     HandleVisibility: 'on'
               HitTest: 'on'
        Interruptible: 'on'
              Selected: 'off'
   SelectionHighlight: 'on'
                   Tag: ''
                  Type: 'line'
        UIContextMenu: []
              UserData: []
               Visible:'on'
                Parent:174.0040
            XDataMode: 'manual'
          XDataSource: ''
          YDataSource: ''
          ZDataSource:
上面标记为红色的属性都是经常用到的关于图形的设置属性。今天我们需要设置的属性是线对象的”LineSmoothing”属性,该属性具有两个状态:”on” |”off”
命令:
  %  set(line_handle,  ‘LineSmoothing’,  ‘on’);
  set(h.Children(1), 'LineSmoothing', 'on');
set(h.Children(2), 'LineSmoothing', 'on');




上图为方案3的效果,下图为方案1export_fig的效果(它把点线的线型都模糊掉了)。下面对方案3中的TickLable的刻度标记进行加粗处理,达到export_fig刻度标记的效果:
set(gca, 'FontWeight', 'bold'); %  FontWeight:{normal} |bold | light | demi,字体粗细
set(gca, ‘FontSize’, 12) ; % 字体大小
上图为方案3的效果,下图为方案1export_fig的效果。
注意:设置好”LineSmoothing”性后,需要将Figure保存为Png或其他栅格格式的图片,如果采用Copy或矢量数据格式折线就会失去平滑的效果。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

20 条回复


hao07 发表于 2013-7-31 15:46:17
谢谢分享,很好的东西。

luhairong11 发表于 2013-8-23 16:12:11
谢谢楼主的分享~~

life段会 发表于 2013-8-25 18:30:18
谢谢楼主的分享~~

竹中籽 发表于 2013-9-13 20:06:43
其实,最近发现MATLAB内置的函数就可以获得很好的光滑的图形;
我一直很羡慕国外书籍中,那些牛人用MATLAB制作出来的漂亮的图形,光滑、好看;
最近,发现采用两种简单的方式也可以生成很光滑、没有锯齿的漂亮图形,分享给大家,希望对大家有一些用途。
第一个函数就是:saveas或者就直接将Figure保存为PDF的格式就可以
% TEST1
t=0:0.5:2*pi;
y1=sin(t);
y2=cos(t);
plot(t,y1,'b-','Linewidth',2);
hold on;
plot(t,y2,'r-','Linewidth',2);
plot(t,y1,'bo',t,y2,'ro');
set(gca,'fontsize',12,'fontweight','blod');

% MATLAB中的Figure


% 保存为PDF
saveas(gcf,'G:\test.pdf');


第二种方法:print()函数   
print(gcf, '-dpng', '-r600', 'G:\test2.png')
参数说明:
gcf  --  当前处于活动状态的Figure窗口的句柄(即当前选中的Figure的句柄);
-dpng -- 表示保存文件的格式-d表示driver,png是保存的图片格式,当然也可以这样,如你想保存为jpeg的格式:-djpeg就可以了;
-r600 -- 表示输出图片的分辨率为600dpi,dpi的含义这里就不再细说了,总之数字越大输出的图像分别率越高,当然数据量也越大了, -r表示resolution,即分辨率的意思,一般的图片保存为-r300已经很清晰了;
G:\test2.png  -- 就是保存图片的名称和path;
下面看看效果如何:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

竹中籽 发表于 2013-9-13 20:09:43
print()输出的图片上传不了,数据量有点儿大4804x3602   402k;
所以上面的图是截图的,实际的效果很好的哈。

竹中籽 发表于 2013-9-13 20:14:55
print()图片的部分截图,由此可见一斑:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

sasmike 发表于 2013-10-18 11:22:52
学习了,新版本看来会加强输出图片质量!期待某一天能输出3D格式的!

vablu 发表于 2013-10-24 20:04:09
膜拜大牛!关于这个问题我找了很久啊!终于解决了,内牛满面T^T
看到到处都说要加密数据输出矢量图啥的,效果都不好。原来这么简单一个属性就搞定了

zxfann 发表于 2013-11-26 19:33:08
讲得很好

jay877877 发表于 2014-4-3 15:56:29
讲的真好....认真拜读了....

hao07 发表于 2014-5-27 19:47:44
很不错哦,谢谢

liuf412044725 发表于 2014-6-24 10:50:56
还有一种更简便的方法,似乎没见过人提起。简单来说,就是利用edit——>copy figure,然后粘到word里。需要注意的有两点,一是copy options中clipboard format 选择第二个即preserve information,figure background color最好也选择第二项。这样得到的图片依然有锯齿;二是对粘贴后的图形点击鼠标反键选择编辑,此时大功告成。下面三张图分别为点编辑前的效果图,点编辑后的效果图和局部放大效果图:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

竹中籽 发表于 2014-6-26 20:45:50
哈哈,很不错的方法@liuf412044725,配合Word的图片编辑功能,可以更灵活地制作漂亮的图形了。:)

lizzieHNU 发表于 2014-8-21 09:37:35
本帖最后由 lizzieHNU 于 2014-8-21 09:39 编辑

重新安装MATLAB r2014a后,就不能使用HG2导出图片了,每次运行到figure, plot绘图时就提示出错“MATLAB has encountered an internal problem and needs to close”,需要关闭MATLAB。如果不使用HG2,则可以运行绘图。
出错详情如下:
  1. MATLAB crash file:C:\Users\ZHIHON~1\AppData\Local\Temp\matlab_crash_dump.5744-1:


  2. ------------------------------------------------------------------------
  3.              Assertion detected at Thu Aug 21 09:41:51 2014
  4. ------------------------------------------------------------------------

  5. Configuration:
  6.   Crash Decoding     : Disabled
  7.   Default Encoding   : GBK
  8.   Java Crash Report  : C:\Users\ZHIHON~1\AppData\Local\Temp\hs_error_pid5744.log
  9.   MATLAB Architecture: win32
  10.   MATLAB Root        : E:\Program Files\MATLAB\R2014a
  11.   MATLAB Version     : 8.3.0.532 (R2014a)
  12.   Operating System   : Microsoft Windows 8.1 企业版
  13.   Processor ID       : x86 Family 6 Model 23 Stepping 10, GenuineIntel
  14.   Virtual Machine    : Java 1.7.0_11-b21 with Oracle Corporation Java HotSpot(TM) Client VM mixed mode
  15.   Window System      : Version 6.3 (Build 9600)

  16. Fault Count: 1


  17. Assertion in void __stdcall mwJavaAbort(void) at b:\matlab\src\jmi\javainit.cpp line 1243:
  18. Fatal Java Exception.  See Java Crash Report for details.

  19. Register State (captured):
  20.   EAX = 7e3e3301  EBX = 000004db
  21.   ECX = 071ce698  EDX = 7e36a5a4
  22.   ESP = 071cebb8  EBP = 071ceec8
  23.   ESI = 071cebe4  EDI = 7e3e3320

  24.   EIP = 7e2518f7  EFL = 00000202

  25.    CS = 2079001b   DS = 04760023   SS = 69770023
  26.    ES = 02180023   FS = 071c003b   GS = 00000000

  27. Stack Trace (captured):
  28. [  0] 0x7e2518f7 E:\Program Files\MATLAB\R2014a\bin\win32\libmwfl.dll+00071927 fl_diag_terminate+00011671
  29. [  1] 0x7e25282a E:\Program Files\MATLAB\R2014a\bin\win32\libmwfl.dll+00075818 fl::diag::terminate+00000058
  30. [  2] 0x7b60ff27   E:\Program Files\MATLAB\R2014a\bin\win32\jmi.dll+00392999 LoadJAWTLibrary+00020215
  31. [  3] 0x06d29cf5 E:\Program Files\MATLAB\R2014a\sys\java\jre\win32\jre\bin\client\jvm.dll+01547509 JVM_FindSignal+00002037
  32. [  4] 0x06d2a8c1 E:\Program Files\MATLAB\R2014a\sys\java\jre\win32\jre\bin\client\jvm.dll+01550529 JVM_FindSignal+00005057
  33. [  5] 0x06d2e817 E:\Program Files\MATLAB\R2014a\sys\java\jre\win32\jre\bin\client\jvm.dll+01566743 JVM_FindSignal+00021271
  34. [  6] 0x06d897ec E:\Program Files\MATLAB\R2014a\sys\java\jre\win32\jre\bin\client\jvm.dll+01939436 JVM_FindSignal+00393964
  35. [  7] 0x06cda5a3 E:\Program Files\MATLAB\R2014a\sys\java\jre\win32\jre\bin\client\jvm.dll+01222051 JVM_Clone+00301587
  36. [  8] 0x06cda607 E:\Program Files\MATLAB\R2014a\sys\java\jre\win32\jre\bin\client\jvm.dll+01222151 JVM_Clone+00301687
  37. [  9] 0x06c8315f E:\Program Files\MATLAB\R2014a\sys\java\jre\win32\jre\bin\client\jvm.dll+00864607 jio_fprintf+00000383
  38. [ 10] 0x06cfa6b7 E:\Program Files\MATLAB\R2014a\sys\java\jre\win32\jre\bin\client\jvm.dll+01353399 JVM_Clone+00432935
  39. [ 11] 0x06cfa820 E:\Program Files\MATLAB\R2014a\sys\java\jre\win32\jre\bin\client\jvm.dll+01353760 JVM_Clone+00433296
  40. [ 12] 0x06d2f009 E:\Program Files\MATLAB\R2014a\sys\java\jre\win32\jre\bin\client\jvm.dll+01568777 JVM_FindSignal+00023305
  41. [ 13] 0x021cc556 E:\Program Files\MATLAB\R2014a\bin\win32\MSVCR100.dll+00378198 endthreadex+00000058
  42. [ 14] 0x021cc600 E:\Program Files\MATLAB\R2014a\bin\win32\MSVCR100.dll+00378368 endthreadex+00000228
  43. [ 15] 0x756117ad                   C:\Windows\system32\KERNEL32.DLL+00006061 BaseThreadInitThunk+00000018
  44. [ 16] 0x77363af4                      C:\Windows\SYSTEM32\ntdll.dll+00342772 AlpcRegisterCompletionListWorkerThread+00000178
  45. [ 17] 0x77363acd                      C:\Windows\SYSTEM32\ntdll.dll+00342733 AlpcRegisterCompletionListWorkerThread+00000139


  46. If this problem is reproducible, please submit a Service Request via:
  47.     http://www.mathworks.com/support/contact_us/

  48. A technical support engineer might contact you with further information.

  49. Thank you for your help.
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

竹中籽 发表于 2015-8-27 22:12:08
lizzieHNU 发表于 2014-8-21 09:37
重新安装MATLAB r2014a后,就不能使用HG2导出图片了,每次运行到figure, plot绘图时就提示出错“MATLAB ha ...

最新的MATLAB版本,图形的绘制跟之前的不一样了。现在2014以后的版本绘制的图像锯齿现象处理了的,比较平滑的。
如果,想制作非常漂亮的MATLAB图形,最合适的就是@liuf412044725提到的方法。我处理一些图形也是采用的这个方法,灵活度很大,可以修改线条的粗细、颜色、线型,Marker的大小、是否填充颜色等等,以及labels的字体、大小、粗细。
*方法也很简单:
(1)点击Figure的Edit菜单,选择“Copy figure”;
(2)打开visio或word(最好2013以后的版本,之前的没有实际操作过,我的是Word2013),打开后,点击粘贴。
(3)然后,选中图形,点击右键出现菜单,选中“组合”->"取消组合",然后,就可以任意编辑啦^_^

微笑one 发表于 2016-3-11 14:42:59
找不到这个属性啊,在图像编辑,更多属性中只找到了linestyle和linewidth

微笑one 发表于 2016-3-11 14:44:06
微笑one 发表于 2016-3-11 14:42
找不到这个属性啊,在图像编辑,更多属性中只找到了linestyle和linewidth

我用的是13版的matlab,关于这个属性还希望大神能给解释下

giantbrain 发表于 2016-4-3 03:19:56
本帖最后由 giantbrain 于 2016-4-3 03:25 编辑

很有用的技巧

竹中籽 发表于 2016-4-7 18:42:06
微笑one 发表于 2016-3-11 14:44
我用的是13版的matlab,关于这个属性还希望大神能给解释下

这个属性是undocument的,在matlab的帮助文档里是搜不到的,用get(x)获取属性也无法看到。
对于新版本,matlab在图形上锯齿现象有所减弱,新版本的matlab建议用print函数,或配合word一起使用的方法。

Utopia2016 发表于 2016-12-18 20:47:39
楼主厉害,问题终于解决了!:D
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表