1. 程式人生 > >python中matplotlib.pyplot包基本繪圖方法詳解

python中matplotlib.pyplot包基本繪圖方法詳解

一般情況下,我們使用以下語句引入該包:

import matplotlib.pyplot as plt

全域性中文字型設定:

pyplot包並不預設支援中文顯示,需要rcParams修改字型來實現。

import matplotlib.pyplot as plt
from pylab import mpl  # 用於畫圖時顯示中文字元

# 定義matplotlib畫圖時的全域性使用仿宋中文字型,如果不定義成中文字型,那麼遇到有中文時不能正常顯示
mpl.rcParams['font.sans-serif'] = ['FangSong']

如果只希望在某些地方使用中文字型,那麼在有中文輸出的地方,增加一個屬性: fontproperties即可。

如:

plt.xlabel(‘橫軸:時間’, fontproperties = 'FangSong', fontsize = 20)

plot快捷繪圖方法:

適用於只有一個figure物件,且figure物件中只有一個子區域時。此時不需要再建立figure物件和subplot子區域,系統會預設建立。

如:

import matplotlib.pyplot as plt
import numpy as np
from pylab import mpl  # 用於畫圖時顯示中文字元

# 定義matplotlib畫圖時的全域性使用仿宋中文字型,如果不定義成中文字型,那麼遇到有中文時不能正常顯示
mpl.rcParams['font.sans-serif'] = ['FangSong']

# 建立x資料,np.linspace()預設建立50個數據的等差數列
x = np.linspace(0, 2 * np.pi)
# 建立y資料
y_sin = np.sin(x)
y_cos = np.cos(x)

# 配置figure區域的大小,10和6指1000X600畫素
plt.rcParams['figure.figsize'] = (10, 6)
# 系統預設建立一個figure,這個figure預設只有一個子區域,在這個子區域中建立一條曲線
plt.plot(x, y_sin, color='blue', linewidth=3, marker='+', linestyle='-', markersize=12, label=r'$y=sin{x}$')
# 再建立一條曲線
plt.plot(x, y_cos, color='red', linewidth=3, linestyle='-', marker='*', markersize=12, label=r'$y=cos{x}$')
# 給預設子區域建立一個標題
plt.title('sin曲線圖', fontsize=20)
# 給預設子區域建立x軸和y軸標籤
plt.xlabel('x軸', fontsize=16)
plt.ylabel('y軸', fontsize=16)
# 設定預設子區域的x和y軸刻度取值範圍
plt.xlim(0, 2 * np.pi)
plt.ylim(-1, 1)
# 設定預設子區域的x軸和y軸的刻度的標籤
plt.xticks([0, 0.5 * np.pi, 1.0 * np.pi, 1.5 * np.pi, 2 * np.pi], [r'0', r'0.5π', r'π', r'1.5π', r'2π'])
plt.yticks([-1.0, 0.0, 1.0], [r'min -1.0', r'0.0', r'max 1.0'])
# 給預設子區域的某個位置上增加文字描述,注意前兩個引數是描述在x軸和y軸座標系中的位置,數值是x和y軸的刻度
plt.text(1.2 * np.pi, 0.8, r'$x \in [0.0, \ pi]$', color='red', fontsize=10)
plt.text(1.2 * np.pi, 0.7, r'$y \in [-1.0, \ 1.0]$', color='red', fontsize=10)
# 給預設子區域上某個點建立一個註解
# xy引數設定'被註解點'的座標,xytext引數設定'註解文字'的位置,可以像xy一樣設定絕對位置,也可以像xytext=(+30,-30)設定與xy點相對位置
# xytext=(+30,-30)指在被註解點向右移動30,向下移動30,textcoords='offset points'指以被註解點為起點
# arrowprops引數設定註解文字與被註解點的連線方式,arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=0.1')指弧度曲線,0.1指弧度
# 標籤中想要有空格,就再空格前一位加一個\
plt.annotate(r'$y\_sin\ max\ point$', xy=(0.5 * np.pi, np.sin(0.5 * np.pi)), xytext=(0.75 * np.pi, 0.7), fontsize=14,
			 color='#090909', arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.1', color='#090909'))
# 設定預設子區域的圖例,loc指圖例在子區域中的位置,best是自動配置最佳位置,upper right是在右上角
# 注意如果想建立圖例,最好在上面建立曲線時給每條曲線設定曲線的label名
plt.legend(loc="upper right")
# 是否要開啟網格線,True開啟網格線
plt.grid(True)
# 顯示畫出來的影象,注意儲存不show時也可以儲存
plt.show()
# 儲存影象,注意圖片儲存的上一級目錄必須存在才能儲存
plt.savefig("./test_image/test.jpg")
# 關閉影象
plt.close()

執行結果如下:

當我們想建立多個figure物件,且每個figure物件中有多個子區域時,不能用上面的快捷方法畫圖。而是要先建立figure物件(fig = plt.figure()),然後將figure物件劃分成多個子區域(ax1 = fig.add_subplot(221)),然後對每個子區域分別繪製這個子區域內的影象。

建立figure物件:

在任何繪圖之前,我們需要一個Figure物件,可以理解成我們需要一張畫布才能開始繪圖。

使用fig = plt.figure()即將一個figure物件命名為fig。

如:

import matplotlib.pyplot as plt

fig = plt.figure()

執行結果如下:

add_subplot()與subplots()劃分子區域

在建立Figure物件之後,我們還要確定這塊畫布上要繪製幾個子圖。

我們可以使用add_subplot函式將畫圖分割成若干塊,併為每一塊命名。這樣我們就可以對每一個子塊區域單獨設定其影象的各種屬性。

ax1=fig.add_subplot(2, 2, 1)即將名為fig的figure劃分為2行2列4塊區域,並把第1號區域(一行一行從左往右數)命名為ax1。也可以寫成ax1=fig.add_subplot(221)。

如:

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)
plt.show()

執行結果如下:

另一種方法plt.subplots(nrows=2, ncols=2)一次性劃分出2行X2列一共4個子區域,這個時候fig也一起建立了:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 2)
axes[0, 0].set(title='Upper Left')
axes[0, 1].set(title='Upper Right')
axes[1, 0].set(title='Lower Left')
axes[1, 1].set(title='Lower Right')
plt.show()

這個時候各個子塊區域不需要命名,其名字可使用位置表示,即axes[0,0],axes[0,1],axes[1,0],axes[1,1]。

執行結果如下:

調整subplots佈局:

fig.subplots_adjust(wspace=0.5, hspace=0.3, left=0.125, right=0.9, top=0.9, bottom=0.1)

子圖水平之間的間隔wspace=0.5,垂直方向上的間距hspace=0.3,左邊距left=0.125 ,右邊距right=0.9,上邊距top=0.9,下邊距bottom=0.1,這裡數值都是百分比的。

如果不確定怎麼調整,使用fig.tight_layout()進行自動調整,使標題之間不重疊。

對figure每塊子區域進行影象屬性設定的一些函式:

注意:

在進行下列設定前必須先建立figure物件,並對figure物件劃分子區域,為各個子區域命名。

ax1是某個子區域的名字。

ax1.title():

對ax1子區域增加一個區域的標題。可同時設定標題字型和字型大小。

如:

ax1.title(‘標題’, fontproperties = 'FangSong', fontsize = 20)

ax1.xlabel()和ax1.ylabel():

對ax1子區域的x和y軸增加文字標籤,可同時設定標籤字型和字型大小。

如:

ax1.xlabel(‘橫軸:時間’, fontproperties = 'FangSong', fontsize = 20)
ax1.ylabel(‘縱軸:數量’, fontproperties = 'FangSong', fontsize = 20)

ax1.xlim()和ax1.ylim():

對ax1子區域的x軸和y軸設定刻度的上下限。第一個引數是下限,第二個引數是上限。

如:

ax1.xlim(0, 10)
ax1.ylim(-1, 1)

ax1.xticks()和ax1.yticks():

對ax1的x軸的刻度值和y軸的刻度值設定標籤。第一個引數是要設定標籤的刻度值,第二個引數是刻度值對應的標籤。注意不是所有的刻度值都一定要設定標籤。

如:

ax1.xticks([0, 0.5 * np.pi, 1.0 * np.pi, 1.5 * np.pi, 2 * np.pi], [r'0', r'0.5π', r'π', r'1.5π', r'2π'])
ax1.yticks([-1.0, 0.0, 1.0], [r'min -1.0', r'0.0', r'max 1.0'])

ax1.text():

在ax1子區域增加一個文字描述。前兩個引數指定文字在這個子區域中的位置,第三個引數是文字的內容。

如:

ax1.text(1.2 * np.pi, 0.8, r'$x \in [0.0, \ pi]$', color='red', fontsize=10)

ax1.annotate():

在ax1子區域增加一個註解。第一個引數是註解內容。xy是被註解點位置,xytext是註解內容的位置, arrowprops引數設定註解文字與被註解點的連線方式。

如:

ax1.annotate(r'$y\_sin\ max\ point$', xy=(0.5 * np.pi, np.sin(0.5 * np.pi)), xytext=(0.75 * np.pi, 0.7), fontsize=14,
			 color='#090909', arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.1', color='#090909'))

ax1.legend():

是否要在ax1子區域顯示圖例。設定顯示圖例之前最好對每條曲線命名一個標籤。loc引數指標籤在子區域的哪個位置。

loc引數: 

'best':0
'upper right':1
'upper left':2
'lower left':3
'lower right':4
'right':5
'center left':6
'center right':7
'lower center':8
'upper center':9
'center':10

如:

ax1.legend(loc="upper right")或ax1.legend(loc=1)

ax1.grid():

是否要在ax1子區域顯示網格線,為True則顯示網格線,為False不顯示網格線,預設不顯示。

如:

ax1.grid(True)

plt.show() 、plt.savefig()、plt.close():

注意:

這三個函式的字首必須是plt,因為這三個操作是對整個figure物件進行的。

plt.show()顯示figure影象,plt.savefig()儲存圖片,plt.close()關閉畫的figure影象。plt.savefig()儲存時上級目錄必須存在才可以儲存,否則會報錯。

如:

plt.show()
plt.savefig("./test_image/test.jpg")
plt.close()

axes=ax1.gca()、axes.spines[]和axes.xaxis/yaxis.set_ticks_position():

使用ax1.gca()獲取子區域ax1的座標軸的資訊axes。

對axes進行移動或其他的一些操作。

[]內參數可以是'top'、'bottom'、'left'、'right'。

axes.spines[]後可接.set_color()、.set_position()、.set_visible()方法。

.set_position()設定邊框位置:

引數可以是'outward','axes','data'。

.set_visible()設定邊框是否可見:

True可見,False不可見。

axes.xaxis/yaxis.set_ticks_position()設定x軸或y軸的刻度標籤的位置:

對xaxis,()引數可以是'top','bottom','both','default'、'none';

對yaxis,()引數可以是'left','right','both','default'、'none'。

如:

# 獲取ax1子區域的座標軸資訊axes
axes = ax1.gca()
#set_color設定axes右邊軸線為透明色
axes.spines['right'].set_color('none') 

# 設定axes頂邊界不可見
axes.spines['top'].set_visible(False)     
# 設定axes右邊界不可見
axes.spines['right'].set_visible(False)  
# 設定axes的x軸刻度值標籤在x軸下方 
axes.xaxis.set_ticks_position('bottom')
# 設定axes的y軸刻度值標籤在y軸左邊 
axes.yaxis.set_ticks_position('left')  

# "outward"
# 移動左、下邊界離 Axes 10 個距離
axes.spines['bottom'].set_position(('outward', 10))
axes.spines['left'].set_position(('outward', 10))

# "data"
# 移動左、下邊界到 (0, 0) 處相交
axes.spines['bottom'].set_position(('data', 0))
axes.spines['left'].set_position(('data', 0))

# "axes"
# 移動左、下邊界,按 Axes 的百分比位置
axes.spines['bottom'].set_position(('axes', 0.75))
axes.spines['left'].set_position(('axes', 0.3)) 

不同型別的圖形繪製:

注意:

當不建立figure和劃分子塊時,系統預設建立一個figure,並在figure上預設建立一個子塊,這時下面的ax1.XXX函式改為plt.XXX函式即可。

曲線圖(.plot()函式):

函式原型:

.plot(x,y,format_string,**kwargs) 

引數說明:

x:x軸資料,列表或陣列,可選

y:y軸資料,列表或陣列

format_string:控制曲線的格式字串,可選,由顏色字元、風格字元和標記字元組成。

**kwargs:第二組或更多,(x,y,format_string)

關於format_string的常用引數:

ax1.plot()函式的字首ax1,表示在ax1這個子區域內新增圖形。注意如果是線條圖,一個子區域內可以同時畫多個線條。

.plot()函式要需要x軸資料,y軸資料,y軸資料可以通過x軸資料來生成。

如:

import matplotlib.pyplot as plt
import numpy as np

# figsize=(8, 6)即figure視窗大小800X600畫素
fig, ax = plt.subplots(2, 2, figsize=(8, 6))
# 建立x資料,np.linspace()預設建立50個數據的等差數列
x = np.linspace(0, 2 * np.pi)
# 建立y資料
y_sin = np.sin(x)
y_cos = np.cos(x)
# 在ax1上同時新增兩條不同的曲線
ax[0, 0].plot(x, y_cos, '.', x, y_sin, '-', linewidth=2, markersize=8)
# 在ax2上新增一條曲線
ax[0, 1].plot(x, y_cos, '-', color='red', marker='+', markersize=12)
plt.show()
plt.close()

執行結果如下:

散點圖(.scatter()函式):

只畫點,但是不用線連線起來。

.scatter()函式的第一、二個引數是x值和y值,s為點的大小,alpha為點的透明度。

如:

import matplotlib.pyplot as plt
import numpy as np

# figsize=(8, 6)即figure視窗大小800X600畫素
fig, ax = plt.subplots(2, 2, figsize=(8, 6))
# 建立x資料
# numpy.random.normal(loc=0.0, scale=1.0, size=None)
# loc:概率分佈的均值,對應著整個分佈的中心center
# scale:概率分佈的標準差,對應於分佈的寬度,scale越大越矮胖,scale越小,越瘦高
# size:輸出的shape,預設為None,只輸出一個值
x = np.random.normal(0, 1, 200)
y = np.random.normal(0, 1, 200)
# s指點大小,alpha指透明度
ax[0, 0].scatter(x, y, s=1, color='green', alpha=0.5)
ax[0, 1].scatter(x, y, s=10, color='red', alpha=0.5)
ax[1, 0].scatter(x, y, s=50, color='blue', marker='+', alpha=0.5)
ax[1, 1].scatter(x, y, s=80, color='blue', alpha=0.5)
plt.show()
plt.close()

執行結果如下:

條形圖(柱狀圖)與橫向條形圖(.bar()和.barh()函式):

條形圖分兩種,一種是縱向條形圖(一般都是這種),還有一種是橫向條形圖。

如:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(2, 2, figsize=(8, 6))
# 建立x資料
np.random.seed(1)
x = np.arange(0, 10, 1)
y = np.random.randint(-5, 5, 10)
# 畫一個條形圖
ax[0, 0].bar(x, y, facecolor='blue', edgecolor='white', alpha=0.5)
# 畫一個橫向條形圖
ax[0, 1].barh(x, y, color='red', edgecolor='white', alpha=0.5)
# 在條形圖的0值分界線畫一條線
ax[0, 1].axvline(0, color='black', linewidth=1)
plt.show()
plt.close()

執行結果如下:

直方圖(.hist()函式):

直方圖將資料分成指定書目的分類,y軸可選擇顯示數量或某類佔總數的百分比。

如:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(2, 2, figsize=(8, 6))
# 建立x資料
np.random.seed(1)
# 生成1000個y資料
y = np.random.normal(0, 1, 1000)
# 畫三個不同的直方圖
# 引數:y資料,density=True則y軸是數量佔總數量百分比,False則y軸是數量,histtype是直方圖型別,alpha為透明度
# bar表示按條形圖風格,stepfilled表示去除條柱的黑色邊框
ax[0, 0].hist(y, 10, density=True, histtype='bar', facecolor='blue', alpha=0.5)
ax[0, 1].hist(y, 10, density=False, histtype='barstacked', facecolor='green', alpha=0.5)
ax[1, 0].hist(y, 10, density=False, histtype='stepfilled', facecolor='red', alpha=0.5)
plt.show()
plt.close()

執行結果如下:

餅狀圖(.pie()函式):

餅圖根據資料的百分比畫餅。labels是各個塊的標籤。autopct=%1.1f%%表示各部分所佔的百分比的格式化輸出,explode表示各部分塊與圓心的距離,值越大離圓心越遠。pctdistance=1.12表示百分比數字距離圓心的距離,預設是0.6。

如:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2, figsize=(8, 6))
# 建立x資料
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode_1 = (0, 0.1, 0, 0)
explode_2 = (0.5, 0.0, 0, 0)
# .pie()引數:各部分百分比,各部分突出程度(值越大越突出),各部分標籤,顯示數字的格式,是否要陰影,起始角度
# pctdistance表示百分比數字距離圓心的距離
# 餅圖預設是圓
ax[0, 0].pie(sizes, explode=explode_1, labels=labels, autopct='%1.1f%%', shadow=True, startangle=0)
# bbox_to_anchor=(1.0, 1.0)中兩個1.0指對上邊和右邊的外邊距離,borderaxespad = 0.3指圖例的內邊距
ax[0, 0].legend(labels=labels, loc="upper right", bbox_to_anchor=(1.3, 1.3), borderaxespad=0.3)
ax[0, 1].pie(sizes, explode=explode_2, labels=labels, autopct='%1.2f%%', shadow=True, startangle=45, pctdistance=0.4)
ax[1, 0].pie(sizes, explode=explode_2, labels=labels, autopct='%1.0f%%', shadow=False, startangle=90, pctdistance=0.8)
plt.show()
plt.close()

執行結果如下:

箱式圖(.boxplot()函式):

箱線圖通過資料的四分位數來展示資料的分佈情況。

把資料從小到大進行排列並等分成四份,第一分位數(Q1),第二分位數(Q2)和第三分位數(Q3)分別為資料的第25%,50%和75%的數字。

I-------------I o I-------------I o I-------------I o I-------------I

                  Q1                Q2                 Q3

    (lower quartile)      (median)     (upper quartile)

四分位間距(Interquartile range(IQR))=上分位數(upper quartile) - 下分位數(lower quartile)

箱線圖分為兩部分,分別是箱(box)和須(whisker)。箱(box)用來表示從第一分位到第三分位的資料,須(whisker)用來表示資料的範圍。

箱線圖從上到下各橫線分別表示:資料上限(通常是Q3+1.5*IQR),第三分位數(Q3),第二分位數(中位數),第一分位數(Q1),資料下限(通常是Q1-1.5*IQR)。有時還有一些圓點,位於資料上下限之外,表示異常值(outliers)。

如:

import matplotlib.pyplot as plt
import numpy as np

# figsize=(8, 6)即figure視窗大小800X600畫素
fig, ax = plt.subplots(2, 2, figsize=(8, 6))
# 建立x資料
y = np.random.normal(0, 1, 1000)
# 畫箱式圖
ax[0, 0].boxplot(y)
ax[0, 1].boxplot(y, vert=False)
plt.show()
plt.close()

執行結果如下:

極座標圖:

如:

import matplotlib.pyplot as plt
import numpy as np

# figsize=(8, 6)即figure視窗大小800X600畫素
fig = plt.figure(figsize=(8, 6))
ax1 = fig.add_subplot(121, projection='polar')
ax2 = fig.add_subplot(122, projection='polar')
N = 30
# 將極座標均分為N份
thetas = np.linspace(0, 2 * np.pi, N, endpoint=False)
# 取一個隨機的角度
turn_rads = 10 * np.random.rand(N)
# 取一個隨機的寬度
widths = np.pi / 4 * np.random.rand(N)

# 從哪個角度開始畫,畫過多少角度長度,畫的扇形的半徑,從距離圓心0的地方開始畫
ax1.bar(thetas, turn_rads, width=widths, facecolor='green', bottom=0.0, alpha=0.5)
ax2.bar(thetas, turn_rads, width=widths, facecolor='red', bottom=2, alpha=0.5)
plt.show()
plt.close()

 執行結果如下:

等高線圖(.contour()和.contourf()函式):

等高線圖:等高線地圖就是將地表高度相同的點連成一環線直接投影到平面形成水平曲線。在機器學習中也會被用在繪製梯度下降演算法的圖形中。

如:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(2, 2, figsize=(10, 6))
# 建立x資料和y資料
x = np.linspace(-2, 2, 100)
y = np.linspace(-2, 2, 100)
# meshgrid函式使用x和y的陣列的值作為x軸和y軸座標點在平面上畫網格。
# 具體來說,就是將x這個100個數值的一維向量按行復制100行,變成X其shape=(100,100)的二維向量,y值也是這麼處理的
# 注意x和y的shape都是(100,),而X和Y的shape為(100,100)和(100,100)
X, Y = np.meshgrid(x, y)
# 注意計算Z要用X和Y計算,這樣計算出來的Z的shape=(100,100),畫圖時資料的shape才能對的上,否則會報錯
Z = (1 - X ** 2 + X ** 5 + Y ** 3) * np.exp(-X ** 2 - Y ** 2)
# Z通常表示的是距離X-Y平面的距離,傳入X、Y則是控制了繪製等高線的範圍。
# contourf會填充輪廓線之間的顏色,而contour不會填充輪廓線之間的顏色
# 10指等高線圖劃分成10個不同範圍的區域,alpha指透明度,cmap=plt.get_cmap('hot')指填充用的顏色域
ax[0, 0].contourf(X, Y, Z, 10, alpha=0.75, cmap=plt.get_cmap('hot'))
# 在ax[0, 0]的contourf圖中繪製等高線
C = ax[0, 0].contour(X, Y, Z, 10, colors='black')
# 顯示各等高線的資料標籤
ax[0, 0].clabel(C, inline=True, fontsize=10)

# ax[0, 1]也是等高線圖,但這個圖沒有填充輪廓線之間的顏色
D = ax[0, 1].contour(X, Y, Z, 10, alpha=0.75, colors='red')
# 顯示各等高線的資料標籤
ax[0, 1].clabel(D, inline=True, fontsize=10)

ax[1, 0].contour(X, Y, Z, 30, alpha=0.75, colors='blue')
plt.show()
plt.close()

執行結果如下:

3D圖:

3D圖在機器學習和深度學習中觀察local minima點和global minima點時十分方便。3D圖可以旋轉角度,以找到最佳的觀察角度。

如:

from mpl_toolkits.mplot3d import Axes3D  # 畫3D圖所需要的包
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(8, 6))
ax = Axes3D(fig)

# 建立x資料和y資料
x = np.linspace(-2, 2, 100)
y = np.linspace(-2, 2, 100)
# meshgrid函式使用x和y的陣列的值作為x軸和y軸座標點在平面上畫網格。
# 具體來說,就是將x這個100個數值的一維向量按行復制100行,變成X其shape=(100,100)的二維向量,y值也是這麼處理的
# 注意x和y的shape都是(100,),而X和Y的shape為(100,100)和(100,100)
X, Y = np.meshgrid(x, y)
# 注意計算Z要用X和Y計算,這樣計算出來的Z的shape=(100,100),畫圖時資料的shape才能對的上,否則會報錯
Z = (1 - X ** 2 + X ** 5 + Y ** 3) * np.exp(-X ** 2 - Y ** 2)
# Z通常表示的是距離X-Y平面的距離,傳入X、Y則是控制了繪製等高線的範圍。
# rstride=1, cstride=1指x方向和y方向的色塊大小,可以不指定
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('hot'))
# 畫出3D圖對應的等高線圖,該等高線圖的z軸值全部壓縮到-1,也就是說這個圖在z=-1的位置,和X-Y平面平行
ax.contourf(X, Y, Z, zdir='z', offset=-1, cmap='hot')
plt.show()
plt.close()

執行結果如下:

動態圖:

動態圖有助於我們實時地觀察某個變數值的變化情況。

如:

from matplotlib import pyplot as plt
from matplotlib import animation  # 讓圖動態更新必須的包
import numpy as np

fig, ax = plt.subplots(figsize=(8, 6))

x = np.linspace(0, 5 * np.pi, 100)
line, = ax.plot(x, np.sin(x), color="red", linewidth=2)


# 更新圖形函式
def animate(i):
	line.set_ydata(np.sin(x + i / 10))
	return line,


# 圖形初始化函式
def initial():
	line.set_ydata(np.cos(x))
	return line,


# func是更新圖形的函式,frames是總共更新的次數,intit_func是圖形初始化函式,interval是更新的間隔時間(ms)
# blit決定是更新整張圖的點(Flase)還是隻更新變化的點(True)
ani = animation.FuncAnimation(fig=fig, func=animate, frames=1000, init_func=initial, interval=50, blit=False)

plt.show()
plt.close()

執行結果如下:

注意這個圖是會不斷更新的。