如何在論文中畫出漂亮的插圖?


GITHUB, 開源包d3。數據可視化利器。http://ghv.artzub.com/#repo=d3&climit=100&user=mbostock&run

 知乎精選: http://www.zhihujingxuan.com/18179.html

 

知乎用戶的回答(1259票)】:

強烈推薦 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 作為運行終端(這張圖是自己的~):如果再搭配上 IPython 作為運行終端(這張圖是自己的~):

簡直就是神器啊,有木有!

心動不如行動,還等什么?

(奉上教程一篇 Matplotlib Tutorial(譯)

==== Update: 2013-9-18 18:04 ====

@許鋮同學提醒,再補充一句,matplotlib 還可以話 xkcd 風格的圖呦~

(圖片引用自網絡)(圖片引用自網絡)

此外結合 IPython Notebook 后更多精彩內容,請看

==== 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 畫出來如下:

代碼在此處:代碼在此處:

代碼在此處:代碼在此處:

【張知洞的回答(376票)】:

  • 我喜歡用Mathematica畫圖,默認出圖漂亮,自定義性好,支持常見各種類型的畫圖,能導出豐富的格式,動態交互和制作動畫也很強大,還有一點:Mathematica很數學,語法和數學上的習慣更接近,函數或方程作圖只需輸入表達式和范圍即可,Matlab和Python中一般需要先手動離散化
  • Matlab的可視化也很強大,不過被吐槽較多的一點是線條有鋸齒(這個和取的點多少無關,其實也能消掉)()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畫的愛心下面是幾個3D的,比較下Matlab和Python畫的愛心

2行代碼創建的2行代碼創建的Menger sponge

Matlab版:Matlab軟件環境下的Sierpinsk地毯及Sierpinski海綿

矢量場流線圖矢量場流線圖

圖論中的圖圖論中的圖

散點圖

更多美圖

【王開源的回答(172票)】:

工科生說Matlab完爆其他

數學系的說Mathematica高貴冷艷

統計系的說R語言作圖領域天下無敵

計算機系的說Python低調奢華有內涵

…………

【知乎用戶的回答(163票)】:

很多人似乎覺得 latex 的畫圖代碼量很大,是的,我這里貼的這些圖的代碼量確實很大,但是,你要和其它畫圖方式相比較的話,總得找一樣的例子吧,下面我給一個很簡單的例子來比較一下用latex 的 pgfplots 畫圖和用 python 的 matplotlib 來畫圖的代碼。

首先是 matplotlib 的。

import numpy as npimport matplotlib.pyplot as pltx = 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 offline.set_dashes(dashes)plt.show()

接着是 pgfplots 的。

documentclass{article}usepackage{pgfplots}egin{document}egin{tikzpicture}egin{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 的。

egin{tikzpicture}

雖然 tikz 不知道是什么意思,但是 begin 和 picture 我知道,所以我猜這是要開始畫圖了。

egin{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

Poppy flower

Modernized Islamic Art

Mandala | TikZ example

可能,理論上說,其它工具也可以畫出這些圖,但是,我懷疑它們是否有一個和latex媲美的社區,提供這么多豐富的資源和代碼。

latex還有一個和stackoverflow媲美的問答網站,我日常工作中會遇到的latex相關的問題的答案,都可以在這里找到TeX - LaTeX Stack Exchange

【傅渥成的回答(20票)】:

這里我先講示意圖吧。先要想好你要用這個示意圖表達什么問題,然后直接用你最熟悉的工具吧,最后存成 pdf 或者 eps,然后再插入到文檔中就可以了。

使用工具的時候,關鍵是要能夠物盡其用。能把有限的工具組合起來用,例如可能在PowerPoint 里找不到好用的橡皮擦,那把一個白色的矩形放在不同的層上其實就可以實現各種效果的「橡皮擦」。畫出這些示意圖,其實不一定要是多么專業的軟件, Keynote,PowerPoint ,只要熟練使用,我覺得這里給出的這些效果都能做出來。

另外,如果做化學、生物領域的一些工作,要畫一些小分子或者大分子的圖,也是一定要熟練掌握某一種軟件就好,最好是用各種命令行工具,當然如果已經用圖形界面很熟練了也沒有必要強制自己改,熟悉的工具就最好了。

要知道,始終是你想表達的東西才是最重要的,例如:

額……以上的示意圖是我隨手畫的,效果肯定很差啦,沒有什么想表達的意味,就是想略模仿並惡搞一下題主給出的一些示意圖。畫上圖用的工具是就是 PowerPoint(橢圓+矩形+曲線),想要說的就是這個弄起來很容易,隨手一弄就能畫,因為沒有仔細修過,平時如果我要自己演示要用,我還會處理得細致些。如果是放到文章里,看你想要發表的雜志的類型,有時候其實並不是越華麗越好。

另外,作圖的時候也是把自己常用的作圖軟件用熟。當然在此基礎上,美觀也很重要的。例如:下面的兩個圖其實是同一個圖,只是換了配色方案。效果你可以感受一下,當然覺得哪種更好可能也跟具體的問題有關(例如下面的兩個圖不但是配色方案不同,在視覺上,二者所強調的區域也有所不同)。這樣的東西就真的是要自己慢慢摸索了。如果你們組里面有老師或者學長學姐在作某些特定類型的圖的時候有一些成熟的配色方案或者是顯示為立體的方案,不論是 MATLAB 的還是 gnuplot 的等等,你都可以向他們請教,並且存在自己電腦里面隨手備用。

【知乎用戶的回答(46票)】:

大家都理解錯了嘛~樓主問的是論文里怎么才能畫出精美的插圖。頂在最前面的Python、Matlab等軟件雖然能准確畫各種常見圖,但是從美術角度來看不及格好嗎!最讓人吐槽的就是這倆的配色!看看直方圖那丑陋的配色!函數圖難看的等高線!一點都不精美!

要比高端大氣上檔次,本頁所有答案完全不是R的ggplot2包的對手嘛~以前我也用Matlab,自從遇到ggplot2之后就徹底成為腦殘粉了!

ggplot2是R的一個package,畫圖風格相當文藝小清新。看論文看到用ggplot2畫圖都是一種享受哦!極為擅長於數據可視化。可惜ggplot2功能沒有Python或者Matlab全面,畫不出稀奇古怪的電路圖不支持三維立體圖像哦~不過作為一個統計繪圖軟件那些功能也不算很重要啦。

ggplot2有一個最大的特點是引入了圖層的概念,各位用過Photoshop應該能理解吧?

你可以隨心所欲將各種基本的圖疊加起來顯示在一張圖上,構造出各種各樣新奇的圖片!

先來一個最基礎的散點圖開胃。這是不調顏色軟件包默認的配色。灰色的背景,黑色的小點點。擬合曲線和置信域看着就很舒服嘛。先來一個最基礎的散點圖開胃。這是不調顏色軟件包默認的配色。灰色的背景,黑色的小點點。擬合曲線和置信域看着就很舒服嘛。

來看看直方圖,和傻大黑粗的Matlab相比精致秀氣多啦!來看看直方圖,和傻大黑粗的Matlab相比精致秀氣多啦!

還有精致的半透明效果!還有精致的半透明效果!

折線圖畫得美到極致了好嗎!

柱狀圖+密度!柱狀圖+密度!

Heat Map!

這么亂糟糟的線也畫得好清新!

ggplot2能把密密麻麻的散點圖畫的極具美感,徹底治愈密集恐懼症!

還可以畫地圖!把非洲畫得這么美我都想去了好嗎!還可以畫地圖!把非洲畫得這么美我都想去了好嗎!

Network也能畫!Network也能畫!

散點圖+誤差區間!散點圖+誤差區間!

極坐標柱狀圖!極坐標柱狀圖!

【車路的回答(14票)】:

各位科學家們,

我雖然無法看懂你們的專業論文中的插圖,

但是我作為一個助人為樂的設計師,

常常幫助你們這樣的專業人士“美化”插圖。

例如:

很多時候,被“美化“插圖的原作者,都會感覺到,新圖和原圖的差別。雖然這些圖中的內容,是我不了解的知識,但是並不阻礙我通過制圖軟件把圖做漂亮。

漂亮的圖和丑陋的圖的區別:

1.均勻的線條

有時候科學家們從這里抓一個圖,那里生成一個圖,每個圖因為放大縮小的關系,線條都變得粗細不同,這樣不會好看的。我修改的第一步一般是把所有線條變成一樣粗細。

2.有規划的色彩

同理,如果色彩紛亂,沒有規划,看上去也會大打折扣。所以建議一開始就對色彩進行一個規划,多圖都統一一下色調。

3.統一的圖形語言

這里是銳利的形狀,那里又是溫柔的圓角,另外一個地方居然是三維的,這就好比論文第一段和第二段的語言風格不一樣,這樣可不行。一定要用同一種圖形語言來制圖。就算全部用兒童手繪效果,也比參雜了水平不同的各種圖形語言要強啊。

好啦,作為經常幫人美化插圖的人,我也只能從圖的角度隨便說一說。其實,如果圖的內容是正確的,想要圖好看最主要要提高的能力絕對不是制圖能力,而是審美能力。當你能夠清楚地知道好看是怎么實現的,什么樣的東西不好看的時候,你就能夠輕松地運用自己熟悉的軟件,制作出非常好的插圖啦。如果有什么問題可以評論問我,我可以從設計的角度和科學家們一起探討。

【王宇的回答(17票)】:

OriginLab 方便快捷

python+numpy+matplotlib 強大、開源、高質量

一般單純的畫圖,或者簡單的數據處理(多項式擬合、fft、包絡等等)用OriginLab 。

復雜的數據處理,或者要與設備相連實時處理實驗數據就用python的那套方案。

【Rio的回答(16票)】:

如果你用 LaTeX 的話,推薦學一下 PGF/TikZ [1]。好處是直接在 LaTeX 文件中用命令繪制需要的各種圖形,是我目前見過的最好的 LaTeX 圖文混排工具。比如其他答案提到的工具的一個共同問題是圖形和文檔是分開制作的,圖形中的文字和文檔中的文字的字體和字號不一樣。PGF/TikZ 就沒有這個問題,工作原理不通。缺點是和 LaTeX 一樣,學習曲線比較陡……

[1]: 

【虞快的回答(2票)】:

如果你會latex的話可以使用tikz package: 

【SaYi的回答(4票)】:

cdr啊…

如果圖像是你知道要畫成什么樣的——那么專業矢量軟件CorelDraw肯定最好……

如果你需要計算機自己按照你的公式運算,然后表現出精確的圖像……我就愛莫能助了……

【知乎用戶的回答(15票)】:

Xfig

Tikz/PGF

OmniGraffle

Inkscape

Dia

Graphviz

GeoGebra

ipe

Mahtematica

conceptdraw

【知乎用戶的回答(14票)】:

前幾天聽報告的時候,被一個3D數據圖震驚了,可視化做得太好了。交流的時候趕緊請教咋做的,答曰:"我提供數據,圖是請計算機學院的人做的。"

這給我一個啟發:論文作圖一般也就是IDL那些,同質化嚴重,要想做出真讓人眼前一亮的插圖,找專業的啊!

【知乎用戶的回答(9票)】:

先上結論:

不用Excel,用Matlab, Visio, Mathematica, WolframAlpha等工具繪圖。

可嘗試學習 、 Pixelmator 、 GeoGebra工具進行比較學習。

————————解釋說明分割線——————————

Excel:

在我有限的科研生涯中,用Excel幾乎是不專業的代名詞,從來沒有看到Excel下畫出的優美漂亮的圖表,所以我至少是使用Matlab或者Mathematica作圖,后者還在學習中。

Matlab:

Matlab的使用是將Excel中的數據以矩陣形式導入到Matlab的向量空間中,然后用Plot函數等其他作圖的函數作出基本的圖形以后,用菜單上選擇Plot Toolkit工具(具體名字我忘了)對函數曲線中的表頭、圖例、箭頭指示、參考線等進行微調。效果如下(自己做的真是渣啊= =):

Visio:

像下面這種簡單的圖形繪制,利用各種基本圖形如線條、箭頭和弧線,再善於利用Visio的對齊功能,就可以作出比較漂亮的圖形,注意變量的格式規范如斜體、字體用Times New Roman字體,另外流程圖用Visio繪制最佳。

流程圖一般用Visio,遵循設計的基本原則如對齊與保持大小一致。

WolframAlpha:

神器中的神器,除了計算功能強大,畫出的函數圖像也相當優美,畫函數圖象的時候直接輸入函數圖像即可自動生成,效果如下:

接下來由請大神@matrix67出場:

@matrix67 在他的博客中提到

Q: 你的 Blog 配圖都好精致!究竟是用什么畫圖的呢?

A: 我用  、 Pixelmator 、 Mathematica 、 GeoGebra 等工具畫圖。配圖的秘訣就是背景透明化、圖形反鋸齒化、注重色彩、多用 png 、圖內字體大小與正文一致。

以下是圖形范例:

以上。

【YolandaHou的回答(3票)】:

推薦paraview,開源可編程,我們空客噪聲技術中心都用

【知乎用戶的回答(2票)】:

作圖軟件很多,我用過origin。

但是作圖軟件和作出漂亮的圖是兩回事,我用origin作圖很簡陋,而我的導師則能作得很漂亮。

【暉小暉的回答(1票)】:

如果會latax最好,lyx是免費的,無版權問題。傻瓜一點,並且不懼怕盜版,那scientifi workplace也還可以。推薦用r畫圖,很強大

【諾娃喵的回答(1票)】:

前面給了好多牛逼軟件,我只推薦一個畫流程圖或者關系圖或者示意圖或者組織結構圖電路圖房屋結構圖等等各種圖又方便又好用又美觀的軟件——Office套件里的Visio啊!!!!

至於數據圖表,請善用Excel,這是個異常強大的軟件,可是大多數人只把它當格子紙用!

【羅磊的回答(1票)】:

 
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM