零基礎用 Python 畫圖表,論文、數據報表必備
曾經我在高中的時候有一篇數學探索的小作業,其中我需要畫出一張比較複雜的函數圖。由於 X 和 Y 的坐標軸標籤都需要一定的自定義,所以微軟 Office 自帶的畫圖工具自然無法滿足我的要求。經過一段時間的尋找,我終於找到了最適合自己的工具:那就是用 Python。
用 matplotlib 可以畫出這樣的圖片,這張圖的源代碼請參考文末
其實,「用 Python」這個說法比較籠統,我們在這篇文章其實是要學習 Python 的一個模組:matplotlib 的簡單使用方法。
使用 matplotlib 這個模組,我們就可以擺脫微軟 Office 的傳統畫圖方法。以此帶來的新畫圖方法就是通過數學式的方法來畫圖。更加有用的是,我們可以方便地自定義圖表,畫出更好看、更美觀的效果。
誠然,使用 matplotlib 畫圖離不開使用編程語言。但是請務必不要害怕接觸編程:畫出一個簡單的圖只需要幾行非常簡單並且易於理解的代碼。畫出複雜一些的圖片也會有一些常識和修正,不過請放心,本篇文章將不會涉及任何高級編程知識,零基礎也能上手。
安裝必要的軟體
本篇文章中,我們涉及到的軟體只有一個免費軟體,那就是 Anaconda。你可以在 這個網站 上下載到 Anaconda,軟體完全免費,並支持 Windows 和 macOS。如果你有安裝 Visual Studio,你可以直接在 Visual Studio 內下載並安裝 Anaconda。通常我們會選擇 Python 3.6 版本。
安裝完成之後,你會在開始菜單中的 Anaconda 文件夾中看到 Spyder 這個應用,我們打開這個應用,迎面而來的就是一個代碼編輯器,我們就要在這個代碼編輯器內寫出所有畫圖的代碼。
編寫代碼:初步了解 matplotlib
打開 Spyder,我們就會看到屏幕的左邊是代碼編輯區域,屏幕的左下角則是輸出區域。在這個步驟,我們將主要操作屏幕的左邊,也就是代碼編輯區域,來輸入我們畫圖用到的代碼。
導入模組
編輯代碼的第一步,就是告訴我們要寫的程序要包括什麼模組。簡單來說我們就是要告訴程序,我們要在程序內包括什麼功能。首先我們輸入以下代碼:
import matplotlib.pyplot as plt import numpy as np
這兩行代碼中, import 的意思就是,我們要導入兩個模組,一個叫做 matplotlib.pyplot,還有一個叫做 numpy。matplotlib.pyplot 主要負責畫圖功能。numpy 則負責高級數學的功能,比如解釋正弦、餘弦函數,Python 本身是不能通過一句簡單的函數來計算某個角度的正弦的,需要外部庫來支持。
在這裡,as 的意思是定義一個別名。在之後的程序中,當我們需要召喚 matplotlib.pyplot 這個程序的時候,我們只需要打出 plt 即可,而無需再打出原來這麼一長串。同理,numpy 在這裡也被取了 np 的別名。
開始編寫
在以上我們做完程序的鋪墊之後,我們就可以正式開始編寫畫圖的代碼了。首先,我們要定義 X 的域,添加以下代碼表示:
x = np.linspace(-1, 1, 256)
在這行代碼中,我們定義了 X 軸的最小值和最大值,括弧中第一個數字 -1 是 X 軸的最小值,括弧中的第二個數字 1 則是 X 的最大值。256 則是取樣密度,這個參數不用改變。
目前這部分很簡單,但是 matplotlib 強大的地方在於可以利用其他的常量來定義邊界,請看下面的例子:
x = np.linspace(-np.pi, np.pi, 256)
在這個例子中,這行代碼會替換上面那行代碼,我們利用了 numpy 模組,使 X 軸的最小值變為 -π,而最大值變成了 π,從而允許我們更直觀地畫出三角函數的圖像。
接下來我們開始定義 Y 軸,假如我們想畫出 sin(x) 的圖像,我們只需要接著輸入:
y = np.sin(x)
在這裡,sin 的前面被加了 np.,是因為 Python 本身不支持正弦函數運算,所以需要註明使用 np 模組才能使用。
又或者,我們想畫出平方的圖像,我們可以替換上面的代碼為:
y = x**2
Python 的四則運算符分別為 +、-、*、/。平方的運算符則為 **,這些運算符是 Python 本身支持的,不需要像前面一樣註明使用 np 模組。關於其他需要使用到 numpy 的運算,比如 log、餘弦、e 等等,敬請參考 numpy 官方文檔。
X 和 Y 的定義完成了,接下來,我們開始指令 matplotlib 來畫出圖像。
畫出圖像
這步非常簡單,只需要在代碼的最後添加一行代碼:
plt.plot(x, y)
最後,點擊工具欄上的綠色箭頭,就可以運行這段代碼。運行完畢之後,你就可以在右下角的窗口上看到你畫出的圖像。右鍵點擊圖像,即可保存。
進階使用:了解 matplotlib 的強大自定義坐標軸
現在我們來開始介紹 matplotlib 最強大的地方:自定義。為什麼我們要使用 matplotlib 來畫圖?就是為了能夠自定義圖表中的一些元素。在上邊的例子中,我們使用了 np.sin() 函數來畫出正弦圖像。但是,matplotlib 默認為我們使用了數字作為 X 軸的坐標軸,這顯然不是最理想的標記方法,那麼我們接下來學習怎樣自定義 X 軸坐標軸。在 plt.plot(x, y) 前加入以下代碼。
plt.xticks([-np.pi, 0, np.pi], ["-π", "0", "π"])
對於這行代碼,可能有一些人會看不明白,別著急,我們一一解釋。
首先我們看第一個方括弧內的數字 [-np.pi, 0, np.pi],這三個數字表示你想在坐標軸內顯示的三個數字的真實數值,你可以改變這些數字,但是每個數字必須要以逗號分開,依順序填寫,在這裡我們使用了 -π、0 和 π。第二個方括弧中,["-π", "0", "π"],這些值表示了真實顯示在圖片上的坐標軸文字,這些文字也必須要和第一個方括弧內的數字相對應,並且每個值都要在引號內填寫(單雙引號均可)。
如果你不需要用文字表達而僅僅需要使用簡單的數字,則不需要填寫第二個方括弧。這裡我們用 Y 軸舉例:
plt.yticks([-1, -0.5, 0, 0.5, 1])
這樣,Y 軸就只會顯示方括弧內的五個數字。
添加標題
添加標題非常簡單,只需要加入一行代碼,確保代碼在 import 語句以下,plt.plot(x, y) 以上:
plt.title("在這裡添加你的標題")
添加坐標軸文本
添加坐標軸文本同樣也非常簡單,加入以下代碼,確保代碼在 import 語句以下,plt.plot(x, y) 以上:
plt.xlabel("X 坐標軸文本") plt.ylabel("Y 坐標軸文本")
畫出多個函數
如果需要畫出多個函數,只需要再定義一個方程,並添加一行 plt.plot 命令即可。複製以下代碼到你的編輯器:
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-np.pi, np.pi, 256) y1 = np.sin(x) y2 = x**2 plt.plot(x, y1) plt.plot(x, y2)
設置圖像風格
matplotlib 還有一個最強大的功能是自定義圖像風格:想畫出虛線、虛點線、點線,都沒問題。我們可以將上面的 plt.plot(x, y1) 和 plt.plot(x, y2) 替換為如下代碼:
plt.plot(x, y1, "b--") plt.plot(x, y2, "r-.")
在這兩行代碼中,我們可以看到 plt.plot 多了第三個參數,第三個參數定義了圖像的風格和顏色,如下圖所示。
上圖中我們可以看到,正弦函數是藍色,X 平方函數則是紅色,這些顏色的配置歸功於第三個參數中的第一個字元:b 和 r,分別表示 blue 和 red。接下來的字元則表示線條的風格,-- 和 -. 分別表示虛線和虛點線。需要注意的是,這裡沒有嚴格的順序,所以即使你寫成 --b,也是沒有問題的。
matplotlib 中還有更多的線條風格和顏色,你可以在這個 官方文檔 中查看。
設置圖像格式以及大小
可能大家已經注意到了:上面我們輸出的函數圖像,其實是非常不清晰的。那麼現在我們來調整圖像。確保以下代碼位置在 import 語句下第一行。
plt.figure(figsize=(3, 5), dpi=300)
大家應該已經注意到了,plt.figure() 內多了兩個參數。其中,figsize 的值定義了圖像的大小,第一個數字代表寬度為三英尺,第二個數字代表寬度為五英尺。dpi 的值則很明顯,代表了圖像的 DPI。這些值您可以根據自己的實際需求進行修改。
後記:為什麼要用 matplotlib?
看完這篇文章,可能會有讀者問:「為什麼我要費勁去寫代碼然後畫出這些不起眼的圖呢?」。其實說到底,這是「學習成本」的問題。對我個人來說,花這些時間學習 matplotlib,對我的未來來說是很有幫助的:對於即將上大學的我,必然會在未來方便我論文的撰寫以及圖表的繪製。
可能也有一些讀者會問:為什麼不用其他的軟體?一方面是 matplotlib 自定義功能強。另一方面,雖然其他的軟體擁有圖形化的界面來簡化畫圖的過程,但是我更喜歡用代碼來解決問題,算是我個人的小癖好之一。
請在 這裡 查看第一張圖的源代碼。
更多 matplotlib 的例子


※使用10幾行Python代碼,快速建立視覺模型識別圖像
※Python網路爬蟲四大選擇器總結
TAG:Python |