Word中插入Python「生成」的矢量圖
科研和學習中,經常需要畫各種圖表。個人比較喜歡用Python畫圖(因為Python處理數據也非常方便)。在知乎上也有不少Python畫圖的回答:。如果你用latex,那麼就能完美地插入Python生成的pdf圖片。而有的時候會出現這樣的**要求:
這個時候如果在Word中插入Python生成的png圖片,效果不是很好,列印以後就更成一團漿糊。下面是插入默認生成的png後虛擬列印生成的pdf,紙上列印效果更差:
此時改變圖片的dpi為200或者以上,再插入Word則清晰度提高很多,但是列印後清晰度提高不大(似乎網上說的列印時選擇高質量列印也沒太大效果?)。那麼有什麼方法可以插入任意縮放後仍然清晰的矢量圖嗎?
Python的圖片保存格式有:eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff。其中,jepg, jpg,tif,tiff插入後列印的效果與png差不多,pgf, ps, raw,rgba,svg,svgz都不可插入。eps格式確實能插入,且為矢量圖,但是文字部分消失:
但是我發現svg格式居然能用IE打開,且放縮都不變!似乎可以考慮由svg轉成矢量圖格式。幾經搜索終於找到一種方法:Inkscape。它是一款矢量編輯軟體,也可以將svg轉成矢量圖格式(如emf),直接用Inkscape打開svg圖片然後另存為emf格式即可,從我的使用體驗看即使有圖片中有中文也能轉,這樣無論是插入Word還是列印都是無比清晰。
但是每次都要手動轉也夠麻煩的,我們還可以用命令行。我是Windows平台,需要先將安裝地址加入PATH。通過文檔發現其轉換語句如下:
inkscape -z target.svg -M target.emf
『-z』後面是已有圖片,『-M』後面是待轉換圖片。
但是每次都要手動敲命令行還是稍顯麻煩,別忘了Python也能調用命令行!我編了一個小腳本示例:
import numpy as npimport matplotlib.pyplot as pltimport subprocessdef convertSVGtoEMF(figname): cmd = inkscape -z %s.svg -M %s.emf % (figname, figname) result = [] # 儲存cmd中結果 process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) for line in process.stdout: result.append(line) errcode = process.returncode for line in result: print(line) if errcode is not None: raise Exception(cmd %s failed, see above for details, cmd)x = np.linspace(-10, 10, 100)y = np.sin(x)plt.figure()plt.plot(x, y)plt.xlabel($x$)plt.ylabel($y$)plt.annotate($y=sin x$, xy=(1, 0), xytext=(0, 0))plt.savefig(sinx.svg)convertSVGtoEMF(sinx)
這樣就可以愉快地生成、插入、列印矢量圖啦~真是滿足了我的強迫症...
推薦閱讀:
※做研究的奧義:象外行一樣思考,象專家一樣實踐
※別人的故事之博後之路
※如何用谷歌學術勾引優秀論文
※工作壓力大,科學家們如何讓自己不被壓垮?
※第一次寫學術論文無從下手怎麼辦?