代码改变世界

TeX系列: MATLAB和LaTeX结合绘图

2016-06-15 21:00  GarfieldEr007  阅读(1791)  评论(0编辑  收藏  举报

目的是在MATLAB中绘图,在LaTeX中利用PGFPlots实现对图的修饰,比如坐标系、坐标轴标记、标题等等。这样能够保证图的中标记与正文文本的一致性,同时又可利用MATLAB强大的数据处理和丰富的绘图功能。整个过程比较顺畅,可以一试。

 

假设LaTeX文档所在的文件夹是E:\TeX,如下MATLAB代码构成的脚本文件保存在该文件夹下,改变MATLAB的当前目录为E:\TeX,执行该MATLAB脚本,在当前目录下得到如下pdf文档。

 

 MATLAB代码:

[python] view plain copy
 
  1. %% 第一个图  
  2. figname='fig1';  
  3. % 绘图  
  4. x=linspace(0,3*pi,20);  
  5. plot(x,sin(x)+100,'-o',x,100+x.^2/20)  
  6. % 绘图结束  
  7. axis off  
  8. set(gca,'Position',[0,0,1,1])  
  9. set(gcf,'PaperSize',[8,8])  
  10. set(gcf,'PaperPosition',[0.01,0.01,7.98,7.98])  
  11. lim=get(gca,'xlim');  
  12. set(gca,'xlim',[lim(1) lim(2)+(lim(2)-lim(1))/19])  
  13. lim=get(gca,'ylim');  
  14. set(gca,'ylim',[lim(1) lim(2)+(lim(2)-lim(1))/19])  
  15. print('-dpdf',figname);  
  16. dlmwrite([figname '.dat'],[get(gca,'xlim');get(gca,'ylim');get(gca,'zlim')],' ');  
  17. %% 第二个图  
  18. figname='fig2';  
  19. % 绘图  
  20. peaks(300);  
  21. shading interp  
  22. view([0,90])  
  23. % 绘图结束  
  24. axis off  
  25. set(gca,'Position',[0,0,1,1])  
  26. set(gcf,'PaperSize',[8,8])  
  27. set(gcf,'PaperPosition',[0.01,0.01,7.98,7.98])  
  28. set(gca,'XLimMode','manual')  
  29. print('-dpdf',figname);  
  30. dlmwrite([figname '.dat'],[get(gca,'xlim');get(gca,'ylim');get(gca,'zlim')],' ');  
  31.   
  32. %% 编译LaTeX文档  
  33. !pdflatex exam.tex  

LaTeX文档(exam.tex):

[python] view plain copy
 
  1. \documentclass[a4paper]{article}  
  2. \usepackage{CJK}  
  3. \usepackage{pgfplots}  
  4. \usepackage{pgfplotstable}  
  5. \pgfplotsset{width=8cm,compat=1.3}  
  6. \begin{document}  
  7. \begin{CJK*}{GBK}{kai}  
  8. \thispagestyle{empty}  
  9.   
  10. \pgfplotstableread{fig1.dat}\loadedtable  
  11. \pgfplotstablegetelem{0}{[index]0}\of{\loadedtable}  
  12. \edef\xmin{\pgfplotsretval}  
  13. \pgfplotstablegetelem{0}{[index]1}\of{\loadedtable}  
  14. \edef\xmax{\pgfplotsretval}  
  15. \pgfplotstablegetelem{1}{[index]0}\of{\loadedtable}  
  16. \edef\ymin{\pgfplotsretval}  
  17. \pgfplotstablegetelem{1}{[index]1}\of{\loadedtable}  
  18. \edef\ymax{\pgfplotsretval}  
  19.   
  20. \begin{center}  
  21.   这是第一个图  
  22. \end{center}  
  23.   
  24. \begin{tikzpicture}  
  25. \begin{axis}[axis x line=bottom, axis y line=left,enlargelimits=false,axis on top]  
  26.   \addplot graphics [xmin=\xmin,xmax=\xmax, ymin=\ymin,ymax=\ymax] {fig1.pdf};  
  27. \end{axis}  
  28. \end{tikzpicture}  
  29.   
  30. \pgfplotstableread{fig2.dat}\loadedtable  
  31. \pgfplotstablegetelem{0}{[index]0}\of{\loadedtable}  
  32. \edef\xmin{\pgfplotsretval}  
  33. \pgfplotstablegetelem{0}{[index]1}\of{\loadedtable}  
  34. \edef\xmax{\pgfplotsretval}  
  35. \pgfplotstablegetelem{1}{[index]0}\of{\loadedtable}  
  36. \edef\ymin{\pgfplotsretval}  
  37. \pgfplotstablegetelem{1}{[index]1}\of{\loadedtable}  
  38. \edef\ymax{\pgfplotsretval}  
  39.   
  40.   
  41. \begin{center}  
  42.   这是第二个图  
  43. \end{center}  
  44.   
  45. \begin{tikzpicture}  
  46. \begin{axis}[enlargelimits=false,axis on top]  
  47.   \addplot graphics [xmin=\xmin,xmax=\xmax, ymin=\ymin,ymax=\ymax] {fig2.pdf};  
  48. \end{axis}  
  49. \end{tikzpicture}  
  50.   
  51.   
  52. \end{CJK*}  
  53. \end{document}  


 

也许有一个更好的办法,使用matlab2tikz把matlab图形直接转化成tikzp/gfplots代码.  参见

http://blog.csdn.net/mathsoperator/article/details/6826208

 

from: http://blog.csdn.net/mathsoperator/article/details/6821336