本文總結(jié)自途索的慕課網(wǎng)課程逛薇,增加了些自己的理解狼犯。
matplotlib 是一個優(yōu)秀的數(shù)據(jù)可視化庫凡纳,可以很方便的使用Python
生成方便我們分析的數(shù)據(jù)圖表窃植,一起來看看吧。
導(dǎo)入必要的包
import matplotlib.pyplot as plt
import numpy as np
如果是在jupyter
中操作荐糜,可以使用%matplotlib inline
這個魔術(shù)方法巷怜,它會將matplotlib
繪制的圖表顯示在記事本中,方便直觀的瀏覽暴氏。
同時我們還導(dǎo)入了numpy
延塑,它是Python語言的一個擴(kuò)充程序庫。支持高級大量的維度數(shù)組與矩陣運(yùn)算答渔,此外也針對數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫关带。
準(zhǔn)備繪圖數(shù)據(jù)
下面我們用它來生成一些繪圖需要的數(shù)據(jù):
x = np.linspace(-np.pi, np.pi, 256)
c, s = np.cos(x), np.sin(x)
linspace
方法指定均勻的生成256個從-pi到pi之間的點(diǎn),返回一個np.array
形式的數(shù)組沼撕。
見名知意宋雏,np.cos(x)
和 np.sin(x)
是對x
做了余弦和正弦的計算,并同樣返回數(shù)組务豺。
開始畫圖
有了數(shù)據(jù)我們開始畫圖:
plt.figure(1) # 當(dāng)作是新建一個畫布
# 在畫布上畫兩個圖形
plt.plot(x, c) # x是橫軸磨总,c是縱軸
plt.plot(x, s)
plt.show() # 顯示圖像
豐富我們的圖形
當(dāng)然,讓面只是一個最簡單的例子笼沥,實(shí)際操作時我們需要更多的標(biāo)注信息蚪燕,來時我們繪制的圖形更易讀娶牌。
線形、顏色和標(biāo)題
在我們原來的代碼上做些許修改:
plt.figure(1)
plt.plot(x, s, color='red', linestyle='-', label='sin') # label 后面繪制圖例用
plt.plot(x, c, 'b--', label='cos') # b* 同時表示顏色和線型
plt.title('sin&cos') # 添加title信息
plt.show()
移動坐標(biāo)軸
看起來好多了馆纳, 可是坐標(biāo)軸在兩側(cè)有點(diǎn)別扭诗良,我們把它挪到中間:
# 獲取軸編輯器
ax = plt.gca()
# 將圖像的上邊框和右邊框隱藏
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 將圖像的下邊框和左邊框設(shè)置到數(shù)據(jù)域的0位置
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))
plt.show()
修改坐標(biāo)值,添加圖例
看起來不錯鲁驶,不過橫軸看不出來我們的繪制點(diǎn)和pi
有啥關(guān)系累榜,我們需要修改下單位信息,同時把圖例加上灵嫌。
# 指定五個點(diǎn)壹罚,使用laText,編輯公式并顯示
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'])
plt.legend(loc='upper left') # 根據(jù)label顯示的圖例相對于畫面的位置
plt.grid() # 顯示網(wǎng)格線
plt.show()
至此我們畫了一個比較可觀的圖形了寿羞,下面是完整代碼:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-np.pi, np.pi, 256)
c, s = np.cos(x), np.sin(x)
plt.figure(1)
plt.plot(x, s, color='red', linestyle='-', label='sin') # label 后面繪制圖例用
plt.plot(x, c, 'b--', label='cos') # b* 同時表示顏色和線型
plt.title('sin&cos') # 添加title信息
# 獲取軸編輯器
ax = plt.gca()
# 將圖像的上邊框和右邊框隱藏
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 將圖像的下邊框和左邊框設(shè)置到數(shù)據(jù)域的0位置
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))
# 指定五個點(diǎn)猖凛,使用laText,編輯公式并顯示
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'])
plt.legend(loc='upper left')
plt.grid()
plt.show()
散點(diǎn)圖的繪制
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
fig.add_subplot(3,3,1) # 將圖像分割成三行三列绪穆,畫在第一個區(qū)域中
n = 128
X = np.random.normal(0,1,n) # 生成隨機(jī)高斯分布辨泳,0是均值,1是標(biāo)準(zhǔn)差玖院,生成128個
Y = np.random.normal(0,1,n)
T = np.arctan2(Y, X) # 上色用
plt.scatter(X, Y, s=10, c=T) # s表示點(diǎn)的大小菠红, c是顏色
# 限制軸的范圍
plt.axis([-2,2,-2,2]) # [xmin, xmax, ymin, ymax]
plt.xticks([]) # 取消顯示軸上的數(shù)值
plt.yticks([])
plt.title('scatter')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
柱狀圖的繪制
# 柱狀圖
fig.add_subplot(332) # 等價于 (3,3,2)
n = 10
X = np.arange(n)
Y1 = (1-X/float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1-X/float(n)) * np.random.uniform(0.5, 1.0, n)
plt.bar(X, +Y1, facecolor='red')
plt.bar(X, -Y2, facecolor='blue')
plt.xticks([]) # 取消顯示軸上的數(shù)值
plt.yticks([])
# 添加注釋
for x, y in zip(X, Y1):
plt.text(x, y, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y2):
plt.text(x, -y, '%.2f' % -y, ha='center', va='top')
plt.show()
繪制餅圖
# 餅圖
fig.add_subplot(333)
n = 10
Z = np.ones(n)
Z[-1] = 2
plt.pie(Z, colors=['%.2f' % (i/float(n)) for i in range(n)],
labels=['%.2f' % (i/float(n)) for i in range(n)])
plt.gca().set_aspect('equal')
plt.xticks([]) # 取消顯示軸上的數(shù)值
plt.yticks([])
plt.title('pie')
plt.show()
繪制極坐標(biāo)圖
# 極坐標(biāo)
fig.add_subplot(334, polar=True) # 畫圖用的是plot, 所以指定polar
n = 20
theta = np.arange(0, 2*np.pi, 2*np.pi/n)
radii = 10*np.random.rand(n)
plt.plot(theta, radii)
plt.title('polar')
plt.show()
熱圖
# 熱圖
fig.add_subplot(335)
from matplotlib import cm # 上色用
cmap = cm.Blues
data = np.random.rand(3,3)
plt.imshow(data, cmap=cmap)
plt.title('heatmap')
plt.show()
3D圖
from mpl_toolkits.mplot3d import Axes3D # 引入三維坐標(biāo)系
fig.add_subplot(336, projection='3d') # 設(shè)置三維畫布
X = [0,3]
Y = [0,3]
Z = [0,3]
plt.plot(X,Y,Z)
plt.title('3d')
plt.show()
熱力圖
# 熱力圖
fig.add_subplot(313)
def f(x,y):
return (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - Y**2)
n = 256
x = np.linspace(-3,3,n)
y = np.linspace(-3,3,n)
X, Y = np.meshgrid(x, y)
plt.contourf(X, Y, f(X, Y), cmap=plt.cm.hot)
plt.show()
結(jié)語
好啦难菌,至此我們用matplotlib
繪制了大多數(shù)的圖形樣式试溯,并且使用了繪制子圖的方式,將其繪制在同一個畫布中郊酒,相信你已經(jīng)可以根據(jù)自己的需求繪制相應(yīng)的圖形了遇绞。
最后如果我們想要保存繪制好的圖形可以這樣操作:
plt.savefig('./fig.png')
在項目目錄下就會的到保存的圖片啦。