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

來自知乎大神的乾貨:http://www.zhihu.com/question/21664179html

 

問題:python

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

常常看到別人論文中畫出各類絢爛的插圖,我想知道這些圖都是用一些什麼樣的軟件畫出來的。好比下面給出的幾張,好吧,我認可有的並不那麼絢爛,但用什麼樣的軟件比較合適呢?具體答案能夠拓展到更爲廣遠的做圖領域。

 

 

大神們的回答:git

 

地鐵風,不會擼程序的設計獅不是好科研狗github

高能預警!!!多圖殺貓!!!我是認真的!!!

首先發個連接: 這哥們的 visualization 能力完爆全部答案(包括個人)加起來,實在是牛逼……

==

這題目都給寫成這樣了,我就不期望讚了。大家就當福利好了。

這個回答裏的圖都是我本身畫的,盜圖必…… 算了大家想拿去玩就拿去吧……

看到這個問題的時候我有點糾結問題裏的最後一張圖是怎麼畫的,不過仔細看了一下我以爲應該是二維空間裏畫的。因此 Asymptote 和 Metapost 均可以。

對了補充一點,在個人另外一個回答裏( 當別人問你的研究有什麼實際價值的時候,你是怎麼回答的?), 我提到對於科研的價值,科研圈和大衆的定義是不同的。對於「漂亮的插圖」也是同樣。君不見大衆媒體裏少有數據圖,就算有也是寥寥幾筆,fancy 爲主,使用符合當前大衆審美的風格(好比如今是扁平、極簡),測量歷來不畫 errorbar,甚至極簡風格的連座標軸都不畫,一條顏色風騷的曲線牛逼閃閃。對於大衆來講,看起來牛逼、fancy 纔是漂亮。可是在科研圈裏顯然不是這樣,並且不一樣的學科之間對圖的嚴謹、清晰程度的要求也不同。因此單純地說一個插圖「漂亮」其實沒什麼意義。

——————————————
正文:

我以爲這個問題讓我答簡直太合適了…… 只要是用來畫圖的玩意我基本都用過,也都會。這個回答主要介紹工具,爲何不說方法呢?由於感受好像沒什麼好說的,你以爲什麼地方難看,改一下就好了啊…… 從最簡單的開始吧。

  • 菜鳥級:

Matlab, MathematicaR 就不說了。

Python 有個著名的庫叫 Matplotlib, 主要用來數據做圖,但自己帶有層次較低的 API, 原則上能夠用來畫任意種類的圖。這玩意自帶 TeX 數學語法。數據做圖效果這樣:



喪病一點能夠這樣:
這種牛逼閃閃的等高線也是小意思~~


這麼多點也是沒問題的:

這玩意極其的靈活,好比 Mathematica 有個功能就是畫函數曲線的時候自動選擇合適的採樣率,斜率或者曲率比較大的地方會自動使用高採樣率。因而我在 Python 裏也實現了一個,這樣就能夠用 Matplotlib 無腦畫函數曲線了,好比這樣:

Gnuplot. 純畫圖方面與 Matplotlib 不相上下,優勢是快,超級快。圖就不放了,和 Matplotlib 差很少。

  • 普通級:

Metapost. 脫 離菜鳥級之後,咱們離開了 API 和程序的地盤,開始擼繪圖語言。首先固然要介紹大名鼎鼎的 Metapost. 這貨的歷史最先要追溯到 Knuth 大神設計的 Metafont, 可是 Metafont 是用來製做字體的,因而一幫人仿照 Metafont 設計了通用繪圖語言 Metapost. 寫程序畫圖相對於使用 GUI 工具來講最大的好處就是能夠精確地控制,和自動化。這種繪圖語言尤爲適合畫示意圖。仍是上圖吧……



費曼圖什麼的簡直就是不在話下…… 其實我是不太明白爲何有些軟件畫出的費曼圖那麼難看的……

而後這是我用 Metapost 給個人統計力學筆記擼的封面:

Asymptote. 有一小撮人用 Metapost 不爽,畢竟語法太古老了,因而搞出了類 C++ 語法的面嚮對象語言 Asymptote, 也是醉了…… 除了寫出來比 metapost 好看一些意外,基本上差很少:



初中幾何題都是能夠的。

這玩意比較逆天的功能是 3D 矢量做圖~~ 你看我這麼一比劃,你不就知道面心立方
的晶胞是什麼樣的了麼~~
繼續
嗯,還有好多圖懶得找了,Asymptote 就先這樣吧。

……
……
……



<更新 2016-01-22>
最近又折騰了一下傳說中的 D3.js. 這個東西的核心其實是一套 selector 實現和把數據綁定到 DOM 上的機制,很是緊湊。而後 HTML 的 DOM 裏能夠包含 SVG, 這就很好玩了。

我試了一下數據做圖

而後順便擼了個 Game of Life, 大家能夠玩玩~~ (暫不支持移動端……),長這樣:

看 上去挺好用,對吧?可是!!這個東西其實並非特別適合給論文出圖,緣由是你用的時候須要把 SVG 保存下來。SVG 是 DOM 的一部分,通常只能用 Javascript 把 SVG 序列化,而後拋出一個文件讓你在瀏覽器裏下載,或者打開一個新窗口你手動另存爲何的,這不是關鍵,關鍵是咱們寫 SVG 的時候常常會用 CSS 來指定樣式,這樣若是你須要全部的線都粗一點,只要改下 CSS 就好,不用碰邏輯。然而你序列化 SVG 的時候是無法同時序列化 CSS 的(吧?)……………………………………
</更新>

  • 地獄級:

這 個級別的工具當之無愧地給了 Postscript 這個基於堆棧的底層頁面描述語言,這個語言是如此的強大,以致於 Adobe 後來不得不發展了簡化版(更易於實現):EPS 和 PDF. 這個語言的神奇之處就是它底層到用戶幾乎忘了它的存在,但同時它寫起來卻不是很費勁。若是你玩過 RPN 計算器,就很容易理解 PS 的邏輯。這玩意最大的好處它的語法十分簡單,不管你用什麼語言來計算,均可以方便地生成 PS 代碼,而不須要考慮你用的語言是否有好用的繪圖 API. 好比我以前玩元胞自動機的時候就能夠用計算的代碼直接生成圖形:
放大一點能夠看到我在圖上直接寫了格點的編號,方便調試~~

  • 奇葩級:

最後這個級別主要是給一些特殊用途的工具。

Graphviz. 這是一個圖可視化工具包,能夠可視化各類無向圖和有向圖。前幾天我剛剛用它畫過一個流程圖:

Blender. 這是一個自由的通用 3D 建模/着色/渲染/動畫套件,我基本上是看着它一點點從一個土了吧唧的山寨三維軟件逐漸進化成如今 Maya 級別的 3D 套件的。大家都在 Nature 雜誌上見過那種很漂亮很 Fancy 但其實沒什麼用的三維渲染圖對吧?我只能說…… 他們若是僱我畫圖的話會更漂亮更 fancy…

不過在放 fancy 圖之前,先放個看起來不那麼 fancy 的:
畫這個圖之前我覺得在 Blender 裏面放幾個立方體幾個球打開卡通渲染就好了……
……
……
……
我簡直就是拿衣服。這貨最後用了三個渲染層才搞定…… 若是有人知道更簡單的方法請告訴我……

下面放 fancy 圖~~
小清新洛倫茲吸引子:

小清新某分子: 這張圖的源文件(分子略不一樣,注意有三個 scenes 須要渲染):


嗯,就先這樣吧~~ 想起什麼再更新……

更新:

Pov-ray: 好像尚未回答裏說起這個。這是一個場景描述語言 + 渲染器,那個渲染器仍是不錯的,就是比較慢。這玩意有兩種用法:
  1. 當渲染器用,主要是在別的 3D 軟件中把場景導出成 pov 文件,而後直接渲染,沒什麼技術含量
  2. 把 數學公式寫進去畫曲面。這個玩法比較特別,配合 pov 強大的渲染器能夠擼一些很是怪異的東東,可是…… Blender 是有 Python API 的,因此其實 Pov-ray 能擼的 Blender 都能擼。我以前有一段時間特別癡迷這個,後來發現然並卵,用 Blender 就好了……
最後再把以前那個連接發一下: 實在是太牛逼,不服不行……

收藏沒有幫助舉報 做者保留權利 web

知乎用戶,midcore programmer
lynn Tongpythonwood胡楠 等人贊同收錄於 編輯推薦
遇到安裝問題的請嘗試Anaconda這個Python發行版。下載安裝後直接使用便可,它幾乎預裝了全部要用到的科學計算及可視化的庫。

有盆友在評論裏說但願能有完整的教程,確實就這個答案來講,離實際使用還有很大的距離,網上相關的中文資料也很少。不過真要寫起來這個答案也裝不下,何況寫在這個問題下也不是很恰當。等到那天我有專欄了再說吧,到時候也許會寫一個關於可視化的系列教程。

=======分割線======

強烈推薦 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 後更多精彩內容,請看

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

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

======== 2014.5.10更新======

看到樓下有人說配色和好看,唉....那我也貼幾個吧...只不過當初限於篇幅沒有寫而已。

首先,python 有一個專門的配色包 jiffyclub/brewer2mpl 路 GitHub,提供了從美術角度來說的精美配色(戳這裏感覺 ColorBrewer: Color Advice for Maps)。
此外還有一些致力於美化繪圖的庫,用起來也都很是方便,好比 olgabot/prettyplotlib 路 GitHub

廢話很少說,上圖就是王道。
(一下圖片來源網絡)

有人可能會說須要複雜的設置,其實也不用。好比上邊這幅圖,只須要多加一個參數就好:
cmap=brewer2mpl.get_map('RdBu', 'diverging', 8, reverse=True).mpl_colormap, 

樓下說到統計繪圖。嘛 seaborn ( ) 是一個調用 matplotlib 的統計繪圖庫,上圖:
代碼一行,後邊的幾乎都是一行,沒作其餘設置,默認就這樣。我就不貼其餘的代碼了:
g = sns.jointplot(x1, x2, kind="kde", size=7, space=0)


這還有個更炫酷的可交互式的繪圖,你們本身戳開看吧

哼哼,完爆了吧~~~~\(≧▽≦)/~

收藏沒有幫助舉報 做者保留權利 編程

隱生宙 ,ฅ^•ﻌ•^ฅ好大一條魚
入睡失敗,排版強迫星人亂入歪題,安利一下本身的繪圖思路和經歷。
  • 論文插圖終歸是內容導向,數據少/邏輯簡單很難畫出炫酷的圖;
  • 專業圖儘可能用對應的專業軟件畫;
  • 大力出奇跡,插圖最終效果跟投入的時間成本(學習軟件+繪製+調試)成正比,只要耐心好學多嘗試,哪怕MS的Office系列也不會讓你失望;
  • 繪圖最重要的是專業性,其次關注「矢量+配色+字體+佈局」;
  • 有時瓶頸在於思路而非工具,作科研的多瀏覽Nature和Science,有不少值得借鑑的繪圖方案;
  • 有精力就再去學學AI和PS吧,後期如虎添翼。

按時間倒序和使用頻率介紹我主要使用的繪圖軟件,專業相關度較高。圖片引用來源均已標明,其他爲本身繪製,若有侵權麻煩告知(圖片放大觀看可還原繪圖軟件輸出效果)。

1. gnuplot
剛完成的碩士論文主要用了LaTeX+gnuplot,gnuplot勝在免費、繪圖效果清爽、專業承認,輸出終端多樣化,插值優化作得也不錯,用下來感受基本可替代Matlab系和Origin,學習成本不低。
  • 簡單的2D圖能夠畫成這樣



  • 複雜一點的信息圖/3D函數/極座標圖/pm3d天然也不在話下
推薦博客 的教程,很是適合新手快速入門。
圖片來源: http://blog.sciencenet.cn/blog-373392-535918.html


2. PowerPoint
只有想不到,沒有畫不了,比起其餘軟件現成的模型模塊,用PowerPoint造輪子的優勢在於細節由本身掌控。學習成本低,我的發揮空間大!
  • 反應器示意圖
用簡單的形狀和線條拼接,自由度高,細節突出(恩,我就是不習慣用Visio)。這張構圖有參照對象,繪圖時間控制在半小時左右。

  • 原理示意圖
PowerPoint做圖方式勝在可視化、直觀和簡便,可量產各類扁平化(我的喜愛)示意圖。
Nature、Science上的插圖偏立體風,經過多圖形多色塊套用和「填充效果」中的「漸變」便可實現(參數怎麼調很考究)。下面這張只花了十分鐘,要進一步改進可細化DNA結構,再給通道中的截面加上多重線性漸變。

  • 彩色信息圖
若是須要用多色塊表達內容,在協調顏色搭配時Office的優點盡顯(用命令行和RGB代碼調試的懂我)。

  • 多內容拼接
下面這張幻燈片用Origin做圖+PowerPoint拼裝,內容不打碼,論文已發Metabolic Engineering。


3. Origin
使 用時間最長的數據繪圖軟件,在普通工科院系Origin就是專業論文繪圖標配。功能豐富全面,多圖層在2D數據處理上很是實用(3D的沒畫過),簡單畫畫 容易上手,深刻以後學習曲線開始變得平緩。因爲渲染效果和自由度的限制,畫出的圖都有一種標誌性的濃郁的Origin風。操做系統不太友好、易崩潰,只支 持Windows系統。學習成本中等!
圖片來源: OriginLab - Origin and OriginPro

重申一遍,圖層疊加+矢量圖輸出+可視化操做足以知足工科生基本需求了,貪多嚼不爛。


4. Matlab
工科生必備軟件,工具包實在強大,數學實驗、反應模擬、系統優化各類課程都離不開它。但在繪圖方面硬傷也很明顯,鋸齒現象明顯、字體/座標軸和3D配色簡直要逼死強迫症……研究生階段搞定優化大做業拿了前3%後就把Matlab扔了。學習成本中等!

恩,matlab的畫風你們都很熟悉了。
圖片來源: Team:NCTU Formosa/modeling

5. 提到Matlab就想起了本科虐人的 COMSOL和化學反應工程模塊, 也印證了文首觀點「專業圖要用專業軟件」,COMSOL的強大在於多場耦合功能突出和各類自定義PDE方程、邊界和平衡條件設置簡便,系統相對友好(並 不)。我最好的朋友出國前把他的真傳——一本磚頭那麼厚的COMSOL tutorial送給了我,後來我再也沒作過仿真模擬,而他去了美國的COMSOL工做(這纔是我安利的緣由,Doge臉),下圖是本科作過的一個案例, 本身的圖找不到了……學習成本高!
圖片來源: Radial Effects in Tubular Reactors


6. Circos
最近新上手的利器,爲繪製全基因組特徵圈圖而生的信息圖軟件,實際上可用來畫各類圈狀信息圖,功能強大使人咋舌,配色美觀耐看(開發者畢竟是專職攝影師),不太方便的是須要安裝Perl運行,學習成本中等,國內教程少。
恩,簡陋版的是個人論文圖片。

圖片來源: Genomic Data // CIRCOS Circular Genome Data Visualization


7. SnapGene
畫質粒的軟件用過很多,SimVector/Plasmid Processor/pDRAW32/Gene Construction Kit/Ape等等,從功能集成和輸出效果來看,仍是SnapGene更勝一籌,操做設計也作得很贊,學習成本低。

商業化質粒可直接查詢 Vector Database,細節作得至關考究,可編輯餘地適中。



8. 化學式繪圖軟件優先級: ChemDraw>tikz的chemfig包 >PowerPoint(黑歷史),學習成本低。補充一句,下面第一張分子式是我組會報告上畫的,鍵角鍵長不符合正式投稿的 美國化學會(ACS)期刊的化學式統一格式——ACS1996標準,使用ChemDraw的話直接在「file」或者「object」中選擇「Apply object settings from」選項則可一鍵改爲ACS1996和其餘一些雜誌要求的標準格式。


9. 統計類可視化軟件
根據google scholar數據統計,2005年以後SPSS和SAS的使用熱度都跌得厲害,R和STATA則呈擡頭之勢(諷刺的是這張統計圖是用ggplot2畫的)。ggplot2繪圖效果請參見本問題其餘回答,由於沒學/用過在此不做任何評價,謝知友提醒。
圖片來源: Discovering Statistics: The Blog: July 2012

本科階段作項目和做業用過STATA,估計工做後會用SAS。STATA的統計迴歸功能相對強大,但可視化作得實在難以恭維,在官網上隨便扒個圖來感覺下。學習成本中等!
圖片來源: Quantile–normal plot

SAS等學了以後再填坑。

10. 化工流程模擬軟件
Aspen Plus和HYSYS都用過,後者上手明顯比前者容易,但作出來的圖確定跟美觀不沾邊啦,就是專業的模擬可視化軟件,學習成本高!放在這就是爲了說明化工和化學不是一回事!化工和化學不是一回事!重要的事情要說兩遍!
Aspen Plus 流程圖來源: 5.2 Hybrid VSA/MEA scrubbing process

HYSYS流程圖來源: Process Simulation

AutoCAD只學了一學期,晶體/蛋白立體結構主要用RASMOL,略過不提。
估計畢業以後就很難有機會再用到上面大部分軟件了(關鍵也用不起),本答案權做記念,感謝閱讀。

收藏沒有幫助舉報 做者保留權利 api

  • 我 喜歡用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畫的愛心

2行代碼建立的 Menger sponge
Matlab版: Matlab軟件環境下的Sierpinsk地毯及Sierpinski海綿
矢量場流線圖 圖論中的圖
散點圖

更多美圖


收藏沒有幫助舉報 做者保留權利 數組

知乎用戶,求小夥伴猛擊
風逝mouse王龍騰 等人贊同收錄於 編輯推薦

開頭放顆愛心吧,圖片是我本身用 LaTex 編譯獲得的,代碼來自 Can we make a love heart with LaTeX?

再放一個今天剛看到的多米諾的圖,以爲超讚,代碼來自 Falling dominoes

以上just for fun。

我 認爲,在如何在論文裏畫圖的問題下面,沒有人重視 LaTex 是一件不合理的事情。LaTex 在學術界的流行程度之廣是無可置疑的,你敢說你投論文歷來沒用過 LaTex?期刊沒有要求過你提交 Tex 源碼?那麼使用 LaTex 原生支持的圖包來畫論文中的插圖是一件很天然的事情,何況,它的繪圖工具庫 (pgfplots) 也沒有很難學。另外,從 TeX - LaTeX Stack Exchange上的問答內容的豐富程度來看,在世界範圍內,LaTex 仍是很流行的。

這個答案不打算很詳細地教你如何入門,但我會給一些很簡單很基礎的例子來告訴你怎麼用 LaTex 的代碼畫出基本的圖形來。至於更復雜的例子,就看你本身啦,網上的 LaTex 資源是很是豐富的。對於我來講,只要有 TeX - LaTeX Stack ExchangeTikZ and PGF 就足夠回答我幾乎全部的 LaTex 平常編碼及 pgfplots 的問題了(你麼有看錯,不用 google 也行,反正你 google 到的大多也是 TeX - LaTeX Stack Exchange 的問答頁面)。

下 面我會先說一下代碼量的問題,由於在不少人提到 LaTex 的繪圖代碼量大。接着,我會說一下代碼可讀性的問題,我認爲 LaTex 的 pgfplots 的繪圖代碼的可讀性優於 python 的 matplotlib,我會舉一個簡單的例子來講明。若是你把這個例子看完,事實上也已經掌握了用 Latex 來繪製簡單的函數圖形的方法。而後,因爲不少人確定會關心如何根據已有的數據來繪製圖形的問題,好比繪製某段時間的溫度變化曲線之類,因此,我會再介紹一 下用 LaTex 讀取數據文件並繪製成曲線圖的方法。我相信你讀完這些內容以後會發現,其實用 LaTex 畫圖,上手也很容易,沒有編程基礎的話也沒有很大難度。你會發現 LaTex 的 pgfplots 包中有不少設定都是對初學者很舒適的。最後,我會給出更多的效果圖。

固然固然,我這裏說的確定是片面的,由於我在努力地誇 LaTex。事實固然是它也有不少缺點,但由於大多數人都對它有偏見,因此我想多誇誇它會更有意義些。


1. 代碼量


很 多人彷佛以爲 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} 

看,代碼量沒什麼太大差距吧。

2. 代碼可讀性

其實,除 了代碼量之外還有一個很重要的問題須要考慮,就是學習曲線。是的,在這個 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 是什麼?好像虛線就是畫一段空一段嘛,因此大概這個 on 就表示畫一段的意思,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 嗎?

3. 數據文件

有不少人提到數據管理的問題。若是我沒理解錯,那麼關鍵的問題就是如何利用存儲在文件中的數據來畫圖。這一點,LaTex 徹底能夠作到。

用 LaTex 最方便地能夠讀取的數據格式是純文本數據,好比你有一個二維點的數組,你能夠存成這樣:

1 -1.5
2 3.4
3 2.2
4 0.9
5 0.4
6 4.1
7 7.0
8 4.8
9 2.9

我如今有一個365天的氣溫數據文件 temperaturesOslo.txt (這個文件來自 Temperature and rain sparklines),其中的365個數據是按照上面的格式存儲的,讀取這個文件並繪製出來的代碼很簡單:
\documentclass{article} \usepackage{tikz} \usepackage{pgfplots} \begin{document} \begin{tikzpicture} \begin{axis} \addplot [mark = none, blue] table {temperaturesOslo.txt}; \end{axis} \end{tikzpicture} \end{document} 
這段代碼中,除了那些和環境設定相關的代碼,關鍵的繪製代碼就只有一行
\addplot [mark = none, blue] table {temperaturesOslo.txt}; 

繪製的結果是

數據文件中,數據的分隔符並不必定要用空格,能夠自定義,使用逗號什麼的也沒問題,當默認讀取失敗時,能夠在代碼中註明你實際使用的分隔符。

有 人也提到和 MATLAB 的數據互通問題,MATLAB 保存的 .mat 文件 LaTex 讀取起來不是很方便(應該有一些 LaTex 的庫能夠作到),主要是由於 .mat 文件是個二進制文件。但有一個變通的更簡單的辦法,由於 MATLAB 也能夠很容易地把數據保存成純文本的格式。

假設我有一個 MATLAB 矩陣 mymatrix,將其保存成純文本格式的代碼是
save('myfile.txt', 'mymatrix', '-ascii','-double'); 

獲得的 myfile.txt 中的數據的格式就和我上面給出的數據格式相同。

4. 更多效果圖

受不鳥了,竟然幾乎木有 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

收藏沒有幫助舉報 做者保留權利 瀏覽器

知乎用戶
西實何俊麗Meer Chou 等人贊同收錄於 編輯推薦
你們都理解錯了嘛~樓主問的是論文裏怎麼才能畫出 精美的插圖。頂在最前面的Python、Matlab等軟件雖然能準確畫各類常見圖,可是 從美術角度來看不及格好嗎!最讓人吐槽的就是這倆的配色!看看直方圖那醜陋的配色!函數圖難看的等高線!一點都不精美!

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

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

ggplot2有一個最大的特色是引入了圖層的概念,各位用過Photoshop應該能理解吧?
你能夠爲所欲爲將各類基本的圖疊加起來顯示在一張圖上,構造出各類各樣新奇的圖片!

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

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

還有精緻的半透明效果!




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

柱狀圖+密度!


Heat Map!

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



ggplot2能把密密麻麻的散點圖畫的極具美感,完全治癒密集恐懼症!



還能夠畫地圖!把非洲畫得這麼美我都想去了好嗎!

Network也能畫!
散點圖+偏差區間!

極座標柱狀圖!


收藏沒有幫助舉報 做者保留權利 網絡

工科生說Matlab完爆其餘
數學系的說Mathematica高貴冷豔
統計系的說R語言做圖領域天下無敵
計算機系的說Python低調奢華有內涵
…………

知乎用戶,Do things right!
這個問題我關注了一年多,許多答案看了許多遍。在這期間不但學會了matplotlib, ggplot2, MATLAB的畫圖功能也瞭解得更深了。在此,感謝 @馮昱堯@Online Pig,謝謝大家的答案讓我開闊了視野。

個人這篇回答並非再多提供一個繪圖軟件,再附上許多絢爛的繪圖實例。這裏我會從零開始介紹如何利用這些繪圖工具畫出一張簡潔美觀大方,並能夠被學術期刊接受並發表的數據圖。

好了,廢話太多,上代碼:
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 2*np.pi, 50) y = np.sin(x) y2 = y + 0.1 * np.random.normal(size=x.shape) fig, ax = plt.subplots() ax.plot(x, y, 'k--') ax.plot(x, y2, 'ro') plt.show() 

只是一個簡單的正弦函數加上一些噪音,這裏數據並不重要,怎麼讓它漂亮起來是重點。
這個圖目前有幾個問題。
  1. 圖片大小不知道。通常期刊都會對圖片大小有要求,好比Elsevier要求單欄圖片寬度90mm,雙欄圖片寬度190mm。詳細要求在這
  2. 什麼字體不知道。期刊都會對字體有詳細要求,好比Elsevier明確說明等寬字體是Courier,襯線字體是Times New Roman,無襯線字體是Arial或者Helvetica;
  3. 字體大小不知道。字體大小最好與正文和其餘圖片大小一致。這是的一致不是說字體大小要如出一轍,但也不能差異過大。好比正式是10pt,那圖片字體通常9pt或者8pt。但全部的圖片字體必須一致。
  4. 圖片有白邊,也就是margins,這在大部分期刊裏都是不容許的。
目前就這麼多,不少同窗會說能夠對圖片後處理啊,切個邊再縮放一下就行了。但問題是剪切縮放後字體大小,線寬都會變形。這也是爲何不少期刊字體大小在每幅圖裏面都不同的主要緣由。

那麼如何作才能克服以上四點問題,再次上代碼:
from matplotlib import rc rc('font', **{'family': 'sans-serif', 'sans-serif': ['Arial'], 'size': 8}) params = {'text.usetex': False, 'mathtext.fontset': 'stixsans'} plt.rcParams.update(params) 
這四行代碼控制字體與字體大小
fig, ax = plt.subplots(num=1, figsize=(3.54, 2.26)) 
這一行,固定了圖片大小
plt.subplots_adjust(right=0.99, left=0.125, bottom=0.14, top=0.975) 
最後這一行調整畫框的位置,用來消除白邊。
如今圖片是這個樣子,應該已經知足大部分期刊的最低要求,注意是最低。接下來還有不少美化工做要做。

首先,marker(實在不知道marker的中文翻譯是什麼,抱歉)尺寸太大,marker的顏色是正紅色, rgb(255,0,0),太不美觀,而且對色盲羣體也不友好。關於顏色的選擇這裏並不展開,不過有一個很好的參考網站 ColorBrewer: Color Advice for Maps。matplotlib也包含了這個網站的各類顏色組合。

先用一小段代碼把其中一組顏色"Set1"提取出來
cm_number = 6
cm = plt.cm.get_cmap("Set1", cm_number)
color = []
for i in range(0, cm_number):
    color.append(cm(1. / (cm_number - 1) * i))
這裏cm_number是指咱們須要多少種不一樣的顏色,而後修改一下plot指令:
ax.plot(x, y2, 'o', markerfacecolor=color[0], markersize=2, markeredgecolor=color[0]) 
圖片如今成了這個樣子。數據可視化有一個重要原則就是去除一切沒必要要的元素,我想了想發現,上邊和右邊的軸線咱們並不須要,因此兩行代碼去掉它們
ax.spines["right"].set_visible(False) ax.spines["top"].set_visible(False) 
並且我但願利用網格代替刻度,這樣讀者能夠更容易發現數據的大小關係。
ax.xaxis.grid(True, which='major', lw=0.5, linestyle='--', color='0.8',
              zorder=1)
ax.yaxis.grid(True, which='major', lw=0.5, linestyle='--', color='0.8',
              zorder=1)
最後圖片的樣子是
今天先到這裏,之後有機會能夠討論下雲圖怎麼畫,但願你們多多交流討論。
最後放一些我自認爲還滿意的圖片,知乎不支持矢量圖,真是遺憾。

收藏沒有幫助舉報 禁止轉載

知乎用戶 資本有力量 我感受…
知乎用戶、樂宇付洪軍 等人贊同
Xfig



Tikz/PGF

OmniGraffle

Inkscape

Dia

Graphviz

GeoGebra

ipe

Mahtematica

conceptdraw

收藏沒有幫助舉報 做者保留權利

知乎用戶
張成知乎用戶、知乎用戶 等人贊同
現今嚴謹的學術圈流行的:

PGF/TikZ:定性圖,精細示意圖,簡單定量圖,數據圖表
Asymptote:複雜定量圖,三維矢量圖

另外還有歷史悠久的MetaPost和PSTricks,但總的來講徹底能夠被以上兩個更優秀的後輩替代。

樓主列的這些圖,是TikZ的專長,用TikZ畫能夠作到完美,特別是與LaTeX文檔的總體交互,比用通常繪圖軟件好得多。例如字體匹配,與正文的參數傳遞,對圖的模塊化引用等。

缺點是學習曲線過陡,非排版強迫症患者堅持不下來。除了畫數據圖表的子集pgfplots能夠分分鐘速成外,PGF/TikZ的其餘功能,上手須要一兩個星期不停地鑽研,精通則須要一兩年。

至於Asymptote,表達力強,效果碉堡,你能夠把它當成封裝了高級繪圖命令,而後輸出矢量圖的OpenGL。它對編程能力的要求一樣很高。

本身通常用Mathematica畫圖,不過也想無責任推薦一下Processing:
Exhibition Archives \ Processing.org
Processing.js

知乎用戶,菜鳥工程師
知乎用戶、northlionHarry L 等人贊同
做圖軟件不少,我用過origin。
可是做圖軟件和做出漂亮的圖是兩回事,我用origin做圖很簡陋,而個人導師則能做得很漂亮。

咱們經常使用Illustrator對圖形進行很好的編輯,還能夠畫一些漂亮的示意圖。

茉茉 ,有色
請允許我重複回答一下、吧!美好的 R ggplot2 包 絕對值得被重複提起嗯!

複雜的和美麗的荔紙多得無以附加,其實也許你須要一些更切實的應用,好比多圖對比。下面的圖例摘自網絡,數據來自 Pippa Norris Shared Datasets,作的是 191 個國家 2000年 GDP per capita 與 Polity score of democracy 的散點圖。

先看個用 lattice 包的圖例:


再來看用 ggplot2 的效果:
且不說美不美,是否是馬上感覺信息量大了起來、解釋起來會更輕鬆?嗯,個人碩士論文裡也用了類似上圖的圖例,比較了六個箱圖。 好東西就要廣而告之。相信我!
相關文章
相關標籤/搜索