不管是數據挖掘仍是數學建模,都免不了數據可視化的問題。對於 Python 來講,matplotlib 是最著名的繪圖庫,它主要用於二維繪圖,固然也能夠進行簡單的三維繪圖。它不但提供了一整套和 Matlab 類似但更爲豐富的命令,讓咱們能夠很是快捷地用 python 可視化數據。python
# 安裝 pip install matplotlib
兩種繪圖風格:dom
MATLAB風格:函數
基本函數是 plot,分別取 x,y 的值,而後取到座標(x,y)後,對不一樣的連續點進行連線。工具
面向對象:spa
建立一個圖形 fig 和一個座標 ax 。3d
fig:figure(plt.Figure) 是一個能容納各類座標軸,圖形,文字和標籤的容器。
ax:axes(plt.Axes) 是一個帶有刻度和標籤的矩形,最終會包含各類可視化元素。
示例: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()
這就是利用面向對象的方式繪圖,在交互模式中能夠看到,每畫一個圖就是產生一個對象,最後再顯示出來。orm
繪圖樣式對象
# 調整座標軸上下限 plt.xlim([xmin, xmax]) plt.ylim([ymin, ymax]) plt.axis([xmin, xmax, ymin, ymax]) # 參數:tight:把圖形設置成緊湊模式,不留多餘的部分 # equal:圖形顯示分辨率爲1:1
文字設置blog
圖形標題:plt.title
座標軸標題:plt.xlabel, plt.ylabel
基礎圖例:plt.legend
注意:對中文不友好,須要額外方法,儘可能使用英文
# 示例 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()
圖例
經過legend能夠設置圖例,同時經過參數的調整能夠細膩的設置圖例的位置、形式等。參數主要包括:
loc:圖例的位置
frameon:是否帶邊框
framealpha:顏色透明
shadow:陰影
# 示例 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()
顏色條
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()
散點圖基礎
散點圖主要以點爲主,數據是不連續的數據,經過設置線的型號來完成。型號包括‘o’、‘+’、‘*’、‘1’、‘h’、‘D’等等,具體使用探索一下就好,用不到太多。
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()
若是設置線型爲點線結合,那麼將繪製出連續的線,對應點處爲所設置的點型。
畫散點圖還可使用scatter函數來畫,他有不少更細節的描述,用法與plot相似,對於數據量較大的可視化時,plot的效率更高一些。
偏差線
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()
連續偏差線表示的是連續量,可使用 plt.plot 和 plt.fill_between 來畫出。
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()
等高線(密度)
plt.contour 等高線
plt.contourf 自帶填充顏色
plt.imshow 顯示圖形
等高線繪製方法:z = f(x,y),z表示高度。當只有一個顏色繪圖時,虛線表示負值,實線表示正值。meshgrid 能夠將一維數據變成二維網格數據。
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()
plt.contourf(x, y, z, 50, cmap='RdGy') # 改成contourf,自動填充顏色,則變爲連續的
基本畫法:plt.hist 能夠直接畫直方圖,參數主要包括:
bins:劃分段(柱數)
color:顏色
alpha:透明度
histtype:圖類型
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()
程序中 random.randn 與 random.rand 相比,randn表示隨機生成的數符合正態分佈,所以畫出圖來是如上圖所示。
plt.subplot(2,1,1) # 子圖,(2,1,1)表明,建立2*1的畫布,而且定位於畫布1 ;等效於plt.subplot(211),即去掉逗號
# subplots 能夠同時建立多個子圖 figure,ax = plt.subplots(2, 3)
# 這是一個靈活建立子圖的方法,能夠建立任意組合的圖形,沒必要一一對齊,如下爲示例: grid = plt.GridSpec(2, 3, wspace=0.3, hspace=0.2) plt.subplot(grid[,:2]) plt.subplot(grid[1,1:3])
文字註釋
經過不一樣的座標變換,能夠把文字放在不一樣的位置:
ax.transData:以數據爲基準
ax.transAxes:以軸爲基準
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()
箭頭註釋
plt.arrow:產生SVG向量圖形式的箭頭,會隨着分辨率改變而改變,不推薦
plt.annotate:能夠建立文字和箭頭
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()
基礎三維圖
matplotlib 中繪製三維圖用到 mplot3d 包。導入 mplot3d 包後,能夠利用 projection 參數,控制繪製三維圖。
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits import mplot3d fig = plt.figure() ax = plt.axes(projection='3d') plt.show()
三維圖中固然包含三個軸,x,y,z。畫線 ax.plot3D,畫點 ax.scatter3D。爲了三維效果,它會自動將遠處的點顏色變淺。
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()
三維等高線
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()
圖形繪製出來後,能夠經過 ax.view_init 來控制觀察的角度,便於理解。
俯仰角度:x-y 平面的旋轉角度
方位角度:沿着 z 軸順時針旋轉角度
上篇文章講述了 pandas 的基本用法,pandas 是數據分析中最重要的工具之一,這裏補充一下 pandas 繪圖。
Series繪圖
# 這是一個小栗子 s1 = Series(np.random.randint(1000).cumsum()) # 建立series,cumsum()是指疊加求和,本位數是前幾項之和 s1.plot() # series有本身的plot函數,裏面能夠寫入想要的參數
DataFrame繪圖
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一不一樣顏色疊在一塊兒