如何在论文中画出漂亮的插图?
经常看到别人论文中画出各种绚烂的插图,我想知道这些图都是用一些什么样的软件画出来的。比如下面给出的几张,好吧,我承认有的并不那么绚烂,但用什么样的软件比较合适呢?具体答案可以拓展到更为广远的作图领域。
知乎用户,计算图形学和计算机视觉,努力学以致用
知乎用户、李嘉、钱钱 等人赞同
很多人似乎觉得 latex 的画图代码量很大,是的,我这里贴的这些图的代码量确实很大,但是,你要和其它画图方式相比较的话,总得找一样的例子吧,下面我给一个很简单的例子来比较 一下用latex 的 pgfplots 画图和用 python 的 matplotlib 来画图的代码。
首先是 matplotlib 的。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10)
line, = plt.plot(x, np.sin(x), '--', linewidth=2)
dashes = [10, 5, 100, 5] # 10 points on, 5 off, 100 on, 5 off line.set_dashes(dashes)
plt.show()
接着是 pgfplots 的。
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot [dash pattern=on 10 off 5 on 100 off 5, domain=0:10, samples=100, very thick, 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 [dash pattern=on 10pt off 5pt on 100pt off 5pt, domain=0:10, samples=100, very thick] {sin(deg(x))};
plot ,这个词我在韦伯词典里查到它的意思是:3 a: to locate (a point) by means of coordinates b: to locate (a curve) by plotted points c: to represent (an equation) by means of a curve so constructed。所以理解应该没难度吧。
dash pattern ,明显是要指定虚线样式的节奏,后面跟了个 on 10pt off 5pt on 100pt off 5pt,on 和 off 是什么?好像虚线就是画一段空一段嘛,所以大概这个o n 就表示画一段的意思,off 就表示空一段的意思,那么后面的数字应该就是这一段的长度了。
domain=0:10,这似乎表示某个域的大小,一般来说,如果我们要画的是一条由某个函数表示的曲线的话,很可能需要关心的域是x 的域。
samples=100,任何一条曲线在画的时候,实际上都是需要采样 (sample) 的,那么这里的意思很可能就应该是采样点数量的意思。
very thick ,很粗?是的,这就是表示粗细,是什么东西的粗细呢?你画曲线的时候最关心的是什么东西的粗细?我相信是曲线本身吧。而且,回过去看看这一行开头写的是 \addplot,所以应该也能猜到这里需要描述的对象是曲线。
blue ,很显然,就是画成蓝色的意思。
最后再看 sin(deg(x)),sin 大家都知道是什么意思,deg 似乎要想一下,
恩...degree 大家都很常用吧,所以这里的意思似乎就是把x 转换成角度的意思,所以,这个图的横坐标应该表示的是弧度。
然后是两个 \end,意思应该也很容易猜到。
现在我们来看 python 的代码,请注意,假设你是一个不会写代码的人。 x = np.linspace(0, 10)
我知道 x 可能是曲线方程的自变量,但是 np 是个啥?下面加个点是什么意思?linspace 可能是 line space 的意思,但是 line space 是什么意思?大概是线的绘制空间吧。你觉得 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 里用的是 very thick 这样的词,所以我们会猜到它是比一般的线要粗很多的。 dashes = [10, 5, 100, 5] # 10 points on, 5 off, 100 on, 5 off
dashes 是虚线的意思。但是后面中括号里的东西就比较难理解了,如果没有#后面的注释的话。再者,你看#后面的这段注释,是不是感觉和latex 里的代码很像?所 以哪段代码更容易理解应该很显然了吧。而且,如果不看这段注释,你知道第一个 10 表示的 on 还是 off 吗?
以上。
/******下面是原来的答案******/
受不鸟了,居然几乎木有latex 的图,我来贴。下面所有的图都来自TeXample.net ,每张图下面都有源码所在的页面地址。
首先是和问题中给的图比较接近的点阵图
Drawing lattice points and vectors
经典的函数曲线,不管是离散点还是直接用function
Pgfplots | TikZ example
Animated definite integral
三维的
Spherical and cartesian grids
Membrane-like surface
网络结构也没问题
Scientific interactions
经典物理力学 Free body diagrams 化学的
RNA
codons table
元素周期表也是可以的
Periodic Table of Chemical Elements
电路
Power
electronics
如果你想要一个示波器
TeXtronics oscilloscope
光学
Polarizing microscope
分形也没什么啦
Lindenmayer systems
有了分形,即使是圣诞树也是有可能的
Christmas fractal tree
手绘风格
Simulating hand-drawn lines with TikZ
还有Art
Sunset
| TikZ example flower
Poppy
Modernized Islamic Art
Mandala | TikZ example
可能,理论上说,其它工具也可以画出这些图,但是,我怀疑它们是否有一个和latex 媲美的社区,提供这么多丰富的资源和代码。
latex 还有一个和stackoverflow 媲美的问答网站,我日常工作中会遇到的latex 相关的问题的答案,都可以在这里找到TeX - LaTeX Stack Exchange 2014-04-20 11 条评论 感谢 分享 收藏 • 没有帮助 • 举报
更多回答
1250
知乎用户,人都是平庸的...
收起
知乎用户、知乎用户、Tiotao 等人赞同
强烈推荐 Python 的绘图模块 matplotlib: python plotting 。画出来的图真的是高端大气上档次,低调奢华有内涵~ 适用于从 2D 到 3D,从标量到矢量的各种绘图。能够保存成从 eps, pdf 到 svg, png, jpg 的多种格式。并且
Matplotlib 的绘图函数基本上都与 Matlab 的绘图函数名字都差不多,迁移的学习成本比较低。开源免费。如图所示(题目描述中的图在最后):
(以下图片均引用自
Thumbnail gallery )
像这种普通的函数图象:
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('triplot of user-specified triangulation')
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 公式的插入,当别人画的图还是这个样子的时候(以下图片引用自Matplotlib Tutorial(译) )
你能够把它变成这个样子:
如果再搭配上 IPython 作为运行终端(这张图是自己的~):
简直就是神器啊,有木有!
心动不如行动,还等什么?
(奉上教程一篇 Matplotlib Tutorial(
译) )
==== Update: 2013-9-18 18:04 ====
经@许铖同学提醒,再补充一句,matplotlib 还可以话 xkcd 风格的图呦~
(图片引用自网络)
此外结合 IPython Notebook 后更多精彩内容,请看http://nbviewer.ipython.org/ ==== Update: 2013-9-19 20:04 ==== 如果嫌安装麻烦并且恰好在 Windows 系统下的话可以尝试Python 的一个发行版winpython - Portable Scientific Python 2/3 32/64bit Distribution for Windows 。
==== Update: 2013-10-1 23:45 ====
鉴于@van li 同学质疑 matplotlib 是否能画出题目中所示的图像,我在这里将题目中的图像用 matplotlib 画出来如下:
代码在此处:
https://gist.github.com/coldfog/c479124328fc6bb8b789
代码在此处:https://gist.github.com/coldfog/5da63a6958fc0a949b522013-12-27
关注问题 115 条评论 感谢 分享 收藏 • 没有帮助 • 举报 收起
375
张知洞
收起
李铮、知乎用户、知乎用户 等人赞同
我喜欢用Mathematica 画图,默认出图漂亮,自定义性好,支持常见各种类型的画图,能导出丰富的格式,动态交互和制作动画也很强大,还有一点:Mathematica 很数学,语法和数学上的习惯更接近,函数或方程作图只需输入表达式和范围即可,Matlab 和 Python中一般需要先手动离散化
Matlab 的可视化也很强大,不过被吐槽较多的一点是线条有锯齿(这个和取的点多少无关,其实也能消掉)
(http://tieba.baidu.com/p/2087817806)3维绘图色调不好看,当然如果有耐心也可以画出漂亮的图形的
∙ Python 的matplotlib 库我也用过,风格是模仿Matlab 的,就默认绘图来说比Matlab 好看(起码没锯齿),好处楼上已经有人说过了,但是并非没有 缺点,使用matplotlib 需要一点编程和Python 基础,对于编程基础不好的同学来说入门会比其他的软件慢一点;matplotlib 的2维绘图 很好,但是3维绘图目前还比较差,各种绘图细节方面的可选项不算很丰富,不支持隐函数绘图(形如F(x,y,z)=0这种),性能也不好(如3D 的 scatter,大概1万个点就开始卡了,Mathematica 和Matlab 10万个点都不算卡),3维的用mayavi 这个库可能更好 ∙
普通函数绘图只需输入表达式以及取值范围,真正的一行代码。
第二幅图中加上Mesh->All,显示出所有点的位置。可以看出Mathematica 很聪明,它知道在变化剧烈的地方取更多的点,变化较少的地方少取一些
Mathematica 不仅支持Latex ,还能直接写二维的公式以及把公式导出为
Latex
不等式区域绘图,在Mathematica 中使用RegionPlot 很简单,但在Matlab 和Matplotlib 中有点麻烦
(下面这个是在极坐标下的)
绘制图表
下面是几个3D 的,比较下Matlab 和Python 画的爱心 http://www.cnblogs.com/qtsharp/archive/2012/03/24/2415147.html
http://www.xue163.com/178/6/1787117.html
2行代码创建的Menger sponge Matlab 版:Matlab 软件环境下的Sierpinsk 地毯及Sierpinski 海绵
矢
量场流线图
图论中的
图
散点图
更多美图 http://www.51xuewen.com/group/513/topic_12635.htm http://mathematica.stackexchange.com/questions/11880/animating-mathematica-se-logo http://mathematica.stackexchange.com/questions/11350/xkcd-style-graphs2013-10-22