畫圖介紹
本文以實用爲第一目標,保證讀者在看完此文之後可以迅速上手 畫圖,掌握所有畫圖的基本技巧。
庫加載
我們使用 matplotlib
來進行 畫圖,具體的庫加載以及初始設置代碼如下所示。
import numpy as np # 加載數學庫用於函數描述
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import style
matplotlib.rcParams['text.usetex'] = True # 開啓Latex風格
plt.figure(figsize=(10, 10), dpi=70) # 設置圖像大小
# style.use('ggplot') # 加載'ggplot'風格
# f, ax = plt.subplots(1, 3) # 設置子圖
每一段代碼都有註釋,可以根據註釋把握每行代碼的內容。看不懂也沒有關係,先把代碼加上,繼續往下看即可。
畫圖的原理
其實原理非常簡單,就是給出一個橫座標的 ,再給出一個對應的縱座標 ,然後設置點大小、點外框大小、線大小、點顏色、線顏色、點形狀、線形狀、標題、標籤即可。設置部分的內容看起來很多,但其實也可以不用設置,不設置就代表使用默認的大小、形狀以及顏色。
除此之外,畫圖最主要的分類就是畫點還是將點連線,如果使用 scatter
函數,則將散點畫在圖中;如果使用 plot
函數,則會將散點連線,在下文中,讀者將會更深刻地感受到這一點。
圖像加載
# plt.tight_layout() # 當有多個子圖時,可以使用該語句保證各子圖標題不會重疊
# plt.savefig('myplot1.pdf', dpi=700) # dpi 表示以高分辨率保存一個圖片文件,pdf爲文件格式,輸出位圖文件
plt.show() # 渲染圖片
上述的代碼中主要就是 plt.show()
語句,其餘語句都是一些其餘設置,看註釋即可明白。
畫圖分類
python
中畫圖主要分爲下述幾類。
- 畫單點
- 畫散點
- 畫散點連線
- 畫函數
主要涉及到的一些 操作
分爲下述幾類。
- 子圖
- 設置橫縱座標範圍
- 圖像標題
- 圖像中畫圖類型的標籤
畫單點
畫單點比較簡單,給出下述代碼以及返回結果即可掌握。(需要加入最開頭給出的初始設置內容)
def main():
X = 1
Y = 100
plt.scatter(X, Y, s=50) // s爲點大小
plt.show()
上圖是加載了 style.use('ggplot')
該風格後的效果,如果去掉該行,輸出將如下所示。
讀者可以根據自己的喜好選擇該風格,也可以去搜索其他的風格,下文接下來的示例將均使用 'ggplot'
風格進行展示。
畫散點
知道了畫單點的方法之後,畫散點就變得非常簡單,因爲我們只需要將單點中傳入的單變量改成一個 即可,具體代碼和效果如下所示。
def main():
X, Y = [], []
for i in range(1, 10):
X.append(i)
Y.append(np.sin(i))
plt.scatter(X, Y, s=50)
plt.show()
散點連線
只有散點,通常會使得圖像變得不夠直觀,因此我們使用 plot
函數將所有散點連在一起,具體操作如下所示。
def main():
X, Y = [], []
for i in range(1, 10):
X.append(i)
Y.append(np.sin(i))
plt.scatter(X, Y, s=50)
plt.show()
我們也可以對 plot
函數進行設置,即可輸出如下所示圖形。
def main():
X, Y = [], []
for i in range(1, 10):
X.append(i)
Y.append(np.sin(i))
plt.plot(X, Y, '-p', color='grey',
marker = 'o',
markersize=8, linewidth=2,
markerfacecolor='red',
markeredgecolor='grey',
markeredgewidth=2)
plt.show()
可以看到我們對於點大小、顏色、點外框顏色、大小以及線顏色、線寬均進行了設置,讀者可以自行選擇設置選項進行嘗試。
畫函數
儘管散點連線了,但是由於散點的密度不夠大,因此我們可以進一步的使用
只有散點,通常會使得圖像變得不夠直觀,因此我們使用 plot
函數將所有散點連在一起,具體操作如下所示。
def main():
X = np.linspace(1, 10, 100) # 將[1,10]區間均分爲100個點,得到100個橫座標
Y = np.sin(X) # 求出100個點的縱座標
plt.plot(X, Y, color="red", linewidth=1.0, linestyle="-") # 將100個散點連在一起
plt.show()
線條形狀、顏色、標籤
在畫函數中我們可以設置線條形狀 linestyle
、線條寬度 linewidth
以及線條顏色 color
。我們接下來介紹常見的幾種線條形狀以及如何給線條加上標籤,並給出具體的代碼供讀者參考。
def main():
X = np.linspace(1, 10, 100)
Y1 = np.sin(X)
Y2 = np.cos(X)
Y3 = -X
Y4 = X
plt.plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label="-")
plt.plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label="--")
plt.plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label="-.")
plt.plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=":")
plt.legend(loc="best") # 把標籤加載到圖中哪個位置
plt.show()
常見的 linestyle
還有 '-', '--', '-.', ':', 'solid', 'dashed', 'dashdot', 'dotted'
,讀者可以自行嘗試。
常見的 legend
的 loc
位置還有 best, upper right, upper left, lower left, lower right, right, center left, center right, lower center, upper center, center
,其中 best
表示將標籤加載到 python
認爲最佳的位置。
支持 Latex 的標籤
由於是函數作圖,因此我們通常會將標籤設置爲線條所代表的函數值,因此我們需要介紹支持 Latex 的標籤。我們將 label
的數值設置爲 r'$x_n$'
即可支持 ,如下圖所示。
def main():
X = np.linspace(0, 1, 100)
Y1 = np.sqrt(X)
Y2 = X
Y3 = X * X
Y4 = X * X * X
plt.plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label=r"$y_1=\sqrt{x}$")
plt.plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label=r"$y_2=x$")
plt.plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label=r"$y_3=x^2$")
plt.plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=r"$y_4=x^3$")
plt.legend(loc="best")
plt.show()
設置橫縱座標標號以及圖像標題
最後我們需要介紹如何給該圖像設置橫縱座標、範圍以及標題。我們首先不設置範圍,則具體代碼以及輸出圖形如下。
def main():
X = np.linspace(0, 1, 100)
Y1 = np.sqrt(X)
Y2 = X
Y3 = X * X
Y4 = X * X * X
plt.plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label=r"$y_1=\sqrt{x}$")
plt.plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label=r"$y_2=x$")
plt.plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label=r"$y_3=x^2$")
plt.plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=r"$y_4=x^3$")
plt.legend(loc="best")
# x、y座標以及標題
plt.xlabel('x', fontsize=18)
plt.ylabel('y', fontsize=18)
plt.title(r'$f(x)=\sqrt{x},x,x^2,x^3$', fontsize=18)
plt.show()
設置橫縱座標的範圍
有的時候我們會覺得系統默認的橫縱座標範圍不合適,因此我們需要自行設置橫縱座標,具體代碼以及結果如下所示。
def main():
X = np.linspace(0, 2, 100)
Y1 = np.sqrt(X)
Y2 = X
Y3 = X * X
Y4 = X * X * X
plt.plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label=r"$y_1=\sqrt{x}$")
plt.plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label=r"$y_2=x$")
plt.plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label=r"$y_3=x^2$")
plt.plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=r"$y_4=x^3$")
plt.legend(loc="best")
# x、y座標以及標題
plt.xlabel('x', fontsize=18)
plt.ylabel('y', fontsize=18)
plt.title(r'$f(x)=\sqrt{x},x,x^2,x^3$', fontsize=18)
# 設置座標範圍
plt.ylim(-1, 4)
plt.xlim(-1, 4)
plt.show()
給函數中的一個點標號
當函數比較複雜的時候,我們往往需要對關鍵點進行標號,通常使用的方式是加箭頭或者不加,我們先給出加箭頭的代碼以及結果。
def main():
X = np.linspace(0, 1, 100)
Y1 = np.sqrt(X)
Y2 = X
Y3 = X * X
Y4 = X * X * X
plt.plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label=r"$y_1=\sqrt{x}$")
plt.plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label=r"$y_2=x$")
plt.plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label=r"$y_3=x^2$")
plt.plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=r"$y_4=x^3$")
plt.legend(loc="best")
# x、y座標以及標題
plt.xlabel('x', fontsize=18)
plt.ylabel('y', fontsize=18)
plt.title(r'$f(x)=\sqrt{x},x,x^2,x^3$', fontsize=18)
# 關鍵點標號
plt.scatter(1, 1, s=100)
plt.ylim(-1, 2)
plt.annotate('End Point', fontsize=20,
xy=(1, 1), xycoords='data',
xytext=(0.8, 0.95), textcoords='axes fraction',
arrowprops=dict(facecolor='black', shrink=0.1),
horizontalalignment='right', verticalalignment='top')
plt.show()
其中 xy(1,1)
表示關鍵點的位置,xycoords='data'
表示關鍵點座標所採用的座標方式, shrink
參數表示箭頭距離關鍵點的距離,horizontalalignment='right', verticalalignment='top'
均表示註釋的位置。
也可以使用不加箭頭的方式,即將上述 annotate
換成下述代碼即可。
# 關鍵點標號
plt.scatter(1, 1, s=100)
plt.ylim(-0.1, 1.3)
plt.xlim(-0.1, 1.3)
plt.annotate("End Point",
xy=(1.05, 1.05),
fontsize=20,
xycoords="data")
色卡
當繪製多個函數時,會發現顏色的設計非常難把握,因此下圖給出一張色卡供顏色選擇。
子圖
最後是如何用 python
畫子圖,其實畫子圖就是將上述的 換成 ,具體操作的思路與之前的操作並沒有太大的區別,接下來給出一個包含橫縱座標、函數座標、標題的完整子圖代碼,讀者可以從代碼中獲取相應操作的代碼。
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import style
style.use('ggplot') # 加載'ggplot'風格
matplotlib.rcParams['text.usetex'] = True # 開啓Latex風格
plt.figure(figsize=(10, 10), dpi=70) # 設置圖像大小
f, ax = plt.subplots(2, 2) # 設置子圖
def func1():
X = np.linspace(0, 1, 100)
Y1 = np.sqrt(X)
# ax[0][0]的設置
ax[0][0].plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label=r"$y_1=\sqrt{x}$")
ax[0][0].set_xlabel('x', fontsize=10)
ax[0][0].set_ylabel('y', fontsize=10)
ax[0][0].set_title(r'$f(x)=\sqrt{x}$', fontsize=16)
ax[0][0].legend(loc="best")
# ax[0][0]關鍵點
ax[0][0].scatter(0.5, np.sqrt(0.5), s=100)
ax[0][0].annotate("End Point",
xy=(0.6, 0.5),
fontsize=12,
xycoords="data")
def func2():
X = np.linspace(0, 1, 100)
Y2 = X
# ax[0][1]的設置
ax[0][1].plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label=r"$y_2=x$")
ax[0][1].set_xlabel('x', fontsize=10)
ax[0][1].set_ylabel('y', fontsize=10)
ax[0][1].set_title(r'$f(x)=x$', fontsize=16)
ax[0][1].legend(loc="best")
# ax[0][1]關鍵點
ax[0][1].scatter(0.5, 0.5, s=100)
ax[0][1].annotate("End Point",
fontsize=12,
xytext=(0.7, 0.1),
xy=(0.5, 0.5),
xycoords="data",
arrowprops=dict(facecolor='gray', shrink=0.15))
def func3():
X = np.linspace(0, 1, 100)
Y3 = X * X
# ax[1][0]的設置
ax[1][0].plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label=r"$y_3=x^2$")
ax[1][0].set_xlabel('x', fontsize=10)
ax[1][0].set_ylabel('y', fontsize=10)
ax[1][0].set_title(r'$f(x)=x^2$', fontsize=16)
ax[1][0].legend(loc="best")
# ax[1][0]關鍵點
ax[1][0].scatter(0.5, 0.5 * 0.5, s=100)
ax[1][0].annotate("End Point",
fontsize=12,
xytext=(0.05, 0.6),
xy=(0.5, 0.5 * 0.5),
xycoords="data",
arrowprops=dict(facecolor='black', shrink=0.1))
def func4():
X = np.linspace(0, 1, 100)
Y4 = X * X * X
# ax[1][1]的設置
ax[1][1].plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=r"$y_4=x^3$")
ax[1][1].set_xlabel('x', fontsize=10)
ax[1][1].set_ylabel('y', fontsize=10)
ax[1][1].set_title(r'$f(x)=x^3$', fontsize=16)
ax[1][1].legend(loc="best")
# ax[1][1]關鍵點
ax[1][1].scatter(0.5, 0.5 * 0.5 * 0.5, s=100)
ax[1][1].annotate("End Point",
xy=(0.2, 0.3),
fontsize=12,
xycoords="data")
def main():
func1()
func2()
func3()
func4()
plt.tight_layout() # 當有多個子圖時,可以使用該語句保證各子圖標題不會重疊
plt.savefig('myplot1.pdf', dpi=700) # dpi 表示以高分辨率保存一個圖片文件,pdf爲文件格式,輸出位圖文件
plt.show()
if __name__ == "__main__":
main()
後記
上述所涉及的內容即爲 應用 matplotlib
畫圖的基本操作了,如果想要進一步的深化畫圖能力,推薦根據需求在 matplotlib
官方文檔 中進行搜索。祝大家在 python
畫圖的路上更進一步!💪💪💪