不論是數據挖掘還是數學建模,都免不了數據可視化的問題。對於 Python 來說,matplotlib 是最著名的繪圖庫,它主要用於二維繪圖,當然也可以進行簡單的三維繪圖。它不但提供了一整套和 Matlab 相似但更為豐富的命令,讓我們可以非常快捷地用 python 可視化數據。
matplotlib基礎
<code># 安裝
pip install matplotlib/<code>
兩種繪圖風格:
- MATLAB風格:
基本函數是 plot,分別取 x,y 的值,然後取到座標(x,y)後,對不同的連續點進行連線。
- 面向對象:
創建一個圖形 fig 和一個座標 ax 。
<code>fig:figure(plt.Figure) 是一個能容納各種座標軸,圖形,文字和標籤的容器。
ax:axes(plt.Axes) 是一個帶有刻度和標籤的矩形,最終會包含各種可視化元素。/<code>
示例:
<code>import matplotlib.pyplot as plt
import numpy as np
# 圖形顯示風格
plt.style.use('seaborn-whitegrid')
# 創建fig和ax
fig = plt.figure()
ax = plt.axes()
x = np.linspace(0,10,100)
# 顯示sin函數圖形
plt.plot(x, np.sin(x))
# 顯示cos函數圖形
plt.plot(x, np.cos(x))
plt.show()/<code>
這就是利用面向對象的方式繪圖,在交互模式中可以看到,每畫一個圖就是產生一個對象,最後再顯示出來。
繪圖樣式
<code># 調整座標軸上下限
plt.xlim([xmin, xmax])
plt.ylim([ymin, ymax])
plt.axis([xmin, xmax, ymin, ymax])
# 參數:tight:把圖形設置成緊湊模式,不留多餘的部分
# equal:圖形顯示分辨率為1:1/<code>
線形圖
文字設置
圖形標題:plt.title
座標軸標題:plt.xlabel, plt.ylabel
基礎圖例:plt.legend
注意:對中文不友好,需要額外方法,儘量使用英文
<code># 示例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1, 10, 100)
plt.plot(x, np.sin(x))
plt.title('sin-function')
plt.xlabel('x-value')
plt.ylabel('y-label')
plt.show()/<code>
圖例
通過legend可以設置圖例,同時通過參數的調整可以細膩的設置圖例的位置、形式等。參數主要包括:
- loc:圖例的位置
- frameon:是否帶邊框
- framealpha:顏色透明
- shadow:陰影
<code># 示例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), color='red', label='sin-function')
ax.plot(x, np.cos(x), color='blue', label='cos-function')
ax.legend(loc='upper right', frameon=True, shadow=True, framealpha=0.2)
# 設置圖例位置為右上,有邊框,有陰影,且透明度為0.2
plt.show()/<code>
顏色條
<code>import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1, 10, 100)
I = np.sin(x) * np.cos(x[:,np.newaxis])
plt.imshow(I)
plt.colorbar()
plt.show()/<code>
散點圖
散點圖基礎
散點圖主要以點為主,數據是不連續的數據,通過設置線的型號來完成。型號包括‘o’、‘+’、‘*’、‘1’、‘h’、‘D’等等,具體使用探索一下就好,用不到太多。
<code>import matplotlib.pyplot as plt
import numpy as np
# 圖形顯示風格
plt.style.use('seaborn-whitegrid')
x = np.linspace(0, 10, 30)
y = np.sin(x)
# 通過設置線型為點來完成散點圖的繪製
plt.plot(x, y, 'o', color='blue')
plt.show()/<code>
如果設置線型為點線結合,那麼將繪製出連續的線,對應點處為所設置的點型。
畫散點圖還可以使用scatter函數來畫,他有很多更細節的描述,用法與plot類似,對於數據量較大的可視化時,plot的效率更高一些。
誤差線
<code>import matplotlib.pyplot as plt
import numpy as np
# 圖形顯示風格
plt.style.use('seaborn-whitegrid')
x = np.linspace(0, 10, 30)
dy = x * 0.5
y = np.sin(x) + dy
plt.errorbar(x, y, yerr=dy, fmt='.k', ecolor='blue')
plt.show()/<code>
連續誤差線表示的是連續量,可以使用 plt.plot 和 plt.fill_between 來畫出。
<code>import matplotlib.pyplot as plt
import numpy as np
# 圖形顯示風格
plt.style.use('seaborn-whitegrid')
x = np.linspace(0, 10, 30)
ysin = np.sin(x)
ycos = np.cos(x)
plt.plot(x, ysin, color='red')
plt.plot(x, ycos, color='blue')
plt.fill_between(x, ysin, ycos, color='gray', alpha=0.2)
plt.show()/<code>
等高線(密度)
- plt.contour 等高線
- plt.contourf 自帶填充顏色
- plt.imshow 顯示圖形
等高線繪製方法:z = f(x,y),z表示高度。當只有一個顏色繪圖時,虛線表示負值,實線表示正值。meshgrid 可以將一維數據變成二維網格數據。
<code>import matplotlib.pyplot as plt
import numpy as np
def f(x, y):
return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)
# 得到網格點矩陣
x, y =np.meshgrid(x, y)
# 計算z軸的值
z = f(x, y)
# 繪製圖形
plt.contour(x, y, z, colors='green')
# plt.contour(x, y, z, 50, cmap='RdGy') # 更改配色,值50等分,紅灰配色
plt.show()/<code>
<code>plt.contourf(x, y, z, 50, cmap='RdGy') # 改為contourf,自動填充顏色,則變為連續的/<code>
直方圖
基本畫法:plt.hist 可以直接畫直方圖,參數主要包括:
- bins:劃分段(柱數)
- color:顏色
- alpha:透明度
- histtype:圖類型
<code>import matplotlib.pyplot as plt
import numpy as np
data = np.random.randn(1000)
plt.hist(data, bins=30, alpha=0.3, histtype='stepfilled', color='blue', edgecolor='none')
plt.show()/<code>
程序中 random.randn 與 random.rand 相比,randn表示隨機生成的數符合正態分佈,因此畫出圖來是如上圖所示。
子圖
<code>plt.subplot(2,1,1) # 子圖,(2,1,1)代表,創建2*1的畫布,並且定位於畫布1 ;等效於plt.subplot(211),即去掉逗號/<code>
<code># subplots 可以同時創建多個子圖
figure,ax = plt.subplots(2, 3) /<code>
<code># 這是一個靈活創建子圖的方法,可以創建任意組合的圖形,不必一一對齊,以下為示例:
grid = plt.GridSpec(2, 3, wspace=0.3, hspace=0.2)
plt.subplot(grid[,:2])
plt.subplot(grid[1,1:3])/<code>
圖例配置
文字註釋
通過不同的座標變換,可以把文字放在不同的位置:
- ax.transData:以數據為基準
- ax.transAxes:以軸為基準
<code>import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
ax.axis = ([0, 1, 0, 1])
ax.text(0.5, 0.5, "Data:(0.5, 0.5)", transform=ax.transData)
ax.text(0.5, 0.1, "Axes:(0.5, 0.1)", transform=ax.transAxes)
plt.show()/<code>
箭頭註釋
- plt.arrow:產生SVG向量圖形式的箭頭,會隨著分辨率改變而改變,不推薦
- plt.annotate:可以創建文字和箭頭
<code>import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0, 20, 1000)
ax.plot(x, np.cos(x))
ax.axis('equal')
ax.annotate("max", xy=(6.28, 1), xytext=(10, 4), arrowprops=dict(facecolor='black', shrink=0.05))
ax.annotate('min', xy=(5 * np.pi, -1), xytext=(2, -6), arrowprops=dict(arrowstyle="->", connectionstyle='angle3, angleA=0, angleB=-90'))
plt.show()/<code>
三維圖
基礎三維圖
matplotlib 中繪製三維圖用到 mplot3d 包。導入 mplot3d 包後,可以利用 projection 參數,控制繪製三維圖。
<code>import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
fig = plt.figure()
ax = plt.axes(projection='3d')
plt.show()/<code>
三維圖中當然包含三個軸,x,y,z。畫線 ax.plot3D,畫點 ax.scatter3D。為了三維效果,它會自動將遠處的點顏色變淺。
<code>import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
fig = plt.figure()
ax = plt.axes(projection='3d')
z = np.linspace(0, 15, 100)
x = np.sin(z)
y = np.cos(z)
ax.plot3D(x, y, z, 'red')
ax.scatter3D(x, y, z, 'blue')
plt.show()/<code>
三維等高線
<code>import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
fig = plt.figure()
ax = plt.axes(projection='3d')
def f(x, y):
return np.sin(np.sqrt(x ** 2 + y ** 2))
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
X, Y =np.meshgrid(x, y)
Z = f(X, Y)
ax.contour3D(X, Y, Z, 50)
plt.show()/<code>
圖形繪製出來後,可以通過 ax.view_init 來控制觀察的角度,便於理解。
- 俯仰角度:x-y 平面的旋轉角度
- 方位角度:沿著 z 軸順時針旋轉角度
pandas繪圖
上篇文章講述了 pandas 的基本用法,pandas 是數據分析中最重要的工具之一,這裡補充一下 pandas 繪圖。
Series繪圖
<code># 這是一個小栗子
s1 = Series(np.random.randint(1000).cumsum()) # 創建series,cumsum()是指疊加求和,本位數是前幾項之和
s1.plot() # series有自己的plot函數,裡面可以寫入想要的參數/<code>
DataFrame繪圖
<code>df = DataFrame(
np.random.randint(1,10,40).reshape(10,4),
columns=['A','B','C','D']
)
df.plot()
# dataframe也有自己的plot,按列畫出來,參數包含ax,選擇輸出的畫布
# 參數:stacked=True,表示一個堆疊的情況,同一個index下,columns一不同顏色疊在一起/<code>
閱讀更多 小田學Python 的文章