如何在论文中画出漂亮的插图.docx
《如何在论文中画出漂亮的插图.docx》由会员分享,可在线阅读,更多相关《如何在论文中画出漂亮的插图.docx(39页珍藏版)》请在冰点文库上搜索。
如何在论文中画出漂亮的插图
经常看到别人论文中画出各种绚烂的插图,我想知道这些图都是用一些什么样的软件画出来的。
比如下面给出的几张,好吧,我承认有的并不那么绚烂,但用什么样的软件比较合适呢?
具体答案可以拓展到更为广远的作图领域。
知乎用户,计算图形学和计算机视觉,努力学以致用
知乎用户、李嘉、钱钱等人赞同
很多人似乎觉得latex的画图代码量很大,是的,我这里贴的这些图的代码量确实很大,但是,你要和其它画图方式相比较的话,总得找一样的例子吧,下面我给一个很简单的例子来比较一下用latex的pgfplots画图和用python的matplotlib来画图的代码。
首先是matplotlib的。
importnumpyasnp
importmatplotlib.pyplotasplt
x=np.linspace(0,10)
line,=plt.plot(x,np.sin(x),'--',linewidth=2)
dashes=[10,5,100,5]#10pointson,5off,100on,5off
line.set_dashes(dashes)
plt.show()
接着是pgfplots的。
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[dashpattern=on10off5on100off5,domain=0:
10,samples=100,verythick,blue]{sin(deg(x))};
\end{axis}
\end{tikzpicture}
\end{document}
看,代码量没什么太大差距吧。
其实,除了代码量以外还有一个很重要的问题需要考虑,就是学习曲线。
是的,在这个latex的学习曲线很陡峭已经几乎被公认的年代里,我居然会说我们可以来比一下学习曲线。
latex的这个pgfplots真的很难学吗?
下面我们来看一下上面给的这两段代码吧,我想说的其实是,latex的这段画图代码对于初学者来说,可读性会比python更好,因为你不用看文档就能够大致猜到latex代码的含义。
我们一行一行地看看绘图有关的代码。
先来看看latex的。
\begin{tikzpicture}
虽然tikz不知道是什么意思,但是begin和picture我知道,所以我猜这是要开始画图了。
\begin{axis}
axis的意思是坐标轴,恩,我猜这是要画坐标轴。
\addplot[dashpattern=on10ptoff5pton100ptoff5pt,domain=0:
10,samples=100,verythick]{sin(deg(x))};
plot,这个词我在韦伯词典里查到它的意思是:
3a:
tolocate(apoint)bymeansofcoordinatesb:
tolocate(acurve)byplottedpointsc:
torepresent(anequation)bymeansofacurvesoconstructed。
所以理解应该没难度吧。
dashpattern,明显是要指定虚线样式的节奏,后面跟了个on10ptoff5pton100ptoff5pt,on和off是什么?
好像虚线就是画一段空一段嘛,所以大概这个on就表示画一段的意思,off就表示空一段的意思,那么后面的数字应该就是这一段的长度了。
domain=0:
10,这似乎表示某个域的大小,一般来说,如果我们要画的是一条由某个函数表示的曲线的话,很可能需要关心的域是x的域。
samples=100,任何一条曲线在画的时候,实际上都是需要采样(sample)的,那么这里的意思很可能就应该是采样点数量的意思。
verythick,很粗?
是的,这就是表示粗细,是什么东西的粗细呢?
你画曲线的时候最关心的是什么东西的粗细?
我相信是曲线本身吧。
而且,回过去看看这一行开头写的是\addplot,所以应该也能猜到这里需要描述的对象是曲线。
blue,很显然,就是画成蓝色的意思。
最后再看sin(deg(x)),sin大家都知道是什么意思,deg似乎要想一下,恩...degree大家都很常用吧,所以这里的意思似乎就是把x转换成角度的意思,所以,这个图的横坐标应该表示的是弧度。
然后是两个\end,意思应该也很容易猜到。
现在我们来看python的代码,请注意,假设你是一个不会写代码的人。
x=np.linspace(0,10)
我知道x可能是曲线方程的自变量,但是np是个啥?
下面加个点是什么意思?
linspace可能是linespace的意思,但是linespace是什么意思?
大概是线的绘制空间吧。
你觉得pgfplots里用的关键字domain和这里的linspace,哪个更容易被理解成x的取值范围?
line,=plt.plot(x,np.sin(x),'--',linewidth=2)
我们不说line后面那个逗号和等号。
plt.plot,似乎就是要画个什么曲线图的意思(主要是plot可以看懂)。
后面的x,我大概能理解,因为上面说x等于某个linspace,所以这里大概也是值linspace。
np.sin(x),不管np是什么意思吧,sin(x)还是能理解的。
然后,你说'--'是什么意思?
linewidth=2,这个很好理解,应该是线的宽度。
不过我不知道2到底是有多宽,比方说它和坐标轴的粗细比,哪个宽?
很多时候我们需要画出来看看才行。
latex里用的是verythick这样的词,所以我们会猜到它是比一般的线要粗很多的。
dashes=[10,5,100,5]#10pointson,5off,100on,5off
dashes是虚线的意思。
但是后面中括号里的东西就比较难理解了,如果没有#后面的注释的话。
再者,你看#后面的这段注释,是不是感觉和latex里的代码很像?
所以哪段代码更容易理解应该很显然了吧。
而且,如果不看这段注释,你知道第一个10表示的on还是off吗?
以上。
/******下面是原来的答案******/
受不鸟了,居然几乎木有latex的图,我来贴。
下面所有的图都来自TeX,每张图下面都有源码所在的页面地址。
首先是和问题中给的图比较接近的点阵图
Drawinglatticepointsandvectors
经典的函数曲线,不管是离散点还是直接用function
Pgfplots|TikZexample
Animateddefiniteintegral
三维的
Sphericalandcartesiangrids
Membrane-likesurface
网络结构也没问题
Scientificinteractions
经典物理力学
Freebodydiagrams
化学的
RNAcodonstable
元素周期表也是可以的
PeriodicTableofChemicalElements
电路
Powerelectronics
如果你想要一个示波器
TeXtronicsoscilloscope
光学
Polarizingmicroscope
分形也没什么啦
Lindenmayersystems
有了分形,即使是圣诞树也是有可能的
Christmasfractaltree
手绘风格
Simulatinghand-drawnlineswithTikZ
还有Art
Sunset|TikZexample
Poppyflower
ModernizedIslamicArt
Mandala|TikZexample
可能,理论上说,其它工具也可以画出这些图,但是,我怀疑它们是否有一个和latex媲美的社区,提供这么多丰富的资源和代码。
latex还有一个和stackoverflow媲美的问答网站,我日常工作中会遇到的latex相关的问题的答案,都可以在这里找到TeX-LaTeXStackExchange
2014-04-2011条评论感谢分享收藏•没有帮助•举报
更多回答
1250
知乎用户,人都是平庸的...
收起
知乎用户、知乎用户、Tiotao等人赞同
强烈推荐Python的绘图模块matplotlib:
pythonplotting。
画出来的图真的是高端大气上档次,低调奢华有内涵~适用于从2D到3D,从标量到矢量的各种绘图。
能够保存成从eps,pdf到svg,png,jpg的多种格式。
并且Matplotlib的绘图函数基本上都与Matlab的绘图函数名字都差不多,迁移的学习成本比较低。
开源免费。
如图所示(题目描述中的图在最后):
(以下图片均引用自Thumbnailgallery)
像这种普通的函数图象:
plt.fill(x,y1,'b',x,y2,'r',alpha=0.3)
以及这种Scatter图(中文不知道该怎么说…):
plt.scatter(x,y,s=area,alpha=0.5)
精致的曲线,半透明的配色。
都显出你那高贵冷艳的X格,最重要的是只需一行代码就能搞定。
从此以后再也不用忍受Matlab以及GNUPlot中那蛋疼的配色了。
想画3D数据?
没有问题(不过用mayavi可能更方便一些):
ax.plot_surface(X,Y,Z,rstride=8,cstride=8,alpha=0.3)
cset=ax.contourf(X,Y,Z,zdir='z',offset=-100,cmap=cm.coolwarm)
cset=ax.contourf(X,Y,Z,zdir='x',offset=-40,cmap=cm.coolwarm)
cset=ax.contourf(X,Y,Z,zdir='y',offset=40,cmap=cm.coolwarm)
四行代码你就能拥有(后三行是画坐标平面上的等高线,严格的额说还是一行)。
除此以外,不过你是矢量场,网络还是什么奇葩的需求都能够搞定:
plt.streamplot(X,Y,U,V,color=U,linewidth=2,cmap=plt.cm.autumn)
plt.colorbar()
plt.triplot(x,y,triangles,'go-')
plt.title('triplotofuser-specifiedtriangulation')
plt.xlabel('Longitude(degrees)')
plt.ylabel('Latitude(degrees)')
ax=plt.subplot(111,polar=True)
bars=ax.bar(theta,radii,width=width,bottom=0.0)
这还没完,Matplotlib还支持Latex公式的插入,当别人画的图还是这个样子的时候(以下图片引用自MatplotlibTutorial(译))
你能够把它变成这个样子:
如果再搭配上IPython作为运行终端(这张图是自己的~):
简直就是神器啊,有木有!
心动不如行动,还等什么?
(奉上教程一篇MatplotlibTutorial(译))
====Update:
2013-9-1818:
04====
经@许铖同学提醒,再补充一句,matplotlib还可以话xkcd风格的图呦~
(图片引用自网络)
此外结合IPythonNotebook后更多精彩内容,请看http:
//nbviewer.ipython.org/
====Update:
2013-9-1920:
04====
如果嫌安装麻烦并且恰好在Windows系统下的话可以尝试Python的一个发行版winpython-PortableScientificPython2/332/64bitDistributionforWindows。
====Update:
2013-10-123:
45====
鉴于@vanli同学质疑matplotlib是否能画出题目中所示的图像,我在这里将题目中的图像用matplotlib画出来如下:
代码在此处:
代码在此处:
关注问题115条评论感谢分享收藏•没有帮助•举报收起
375
张知洞
收起
李铮、知乎用户、知乎用户等人赞同
∙我喜欢用Mathematica画图,默认出图漂亮,自定义性好,支持常见各种类型的画图,能导出丰富的格式,动态交互和制作动画也很强大,还有一点:
Mathematica很数学,语法和数学上的习惯更接近,函数或方程作图只需输入表达式和范围即可,Matlab和Python中一般需要先手动离散化
∙Matlab的可视化也很强大,不过被吐槽较多的一点是线条有锯齿(这个和取的点多少无关,其实也能消掉)(
∙Python的matplotlib库我也用过,风格是模仿Matlab的,就默认绘图来说比Matlab好看(起码没锯齿),好处楼上已经有人说过了,但是并非没有缺点,使用matplotlib需要一点编程和Python基础,对于编程基础不好的同学来说入门会比其他的软件慢一点;matplotlib的2维绘图很好,但是3维绘图目前还比较差,各种绘图细节方面的可选项不算很丰富,不支持隐函数绘图(形如F(x,y,z)=0这种),性能也不好(如3D的scatter,大概1万个点就开始卡了,Mathematica和Matlab10万个点都不算卡),3维的用mayavi这个库可能更好
普通函数绘图只需输入表达式以及取值范围,真正的一行代码。
第二幅图中加上Mesh->All,显示出所有点的位置。
可以看出Mathematica很聪明,它知道在变化剧烈的地方取更多的点,变化较少的地方少取一些
Mathematica不仅支持Latex,还能直接写二维的公式以及把公式导出为Latex
不等式区域绘图,在Mathematica中使用RegionPlot很简单,但在Matlab和Matplotlib中有点麻烦
(下面这个是在极坐标下的)
绘制图表
下面是几个3D的,比较下Matlab和Python画的爱心
2行代码创建的Mengersponge
Matlab版:
Matlab软件环境下的Sierpinsk地毯及Sierpinski海绵
矢量场流线图
图论中的图
散点图
更多美图