資料分析庫之matplotlib
一、Matplotlib基礎知識
Matplotlib中的基本圖表包括的元素
-
x軸和y軸 axis 水平和垂直的軸線
-
軸標籤 axisLabel 水平和垂直的軸標籤
-
x軸和y軸刻度 tick 刻度標示座標軸的分隔,包括最小刻度和最大刻度
-
x軸和y軸刻度標籤 tick label 表示特定座標軸的值
-
繪圖區域(座標系) axes 實際繪圖的區域
-
畫布 figure 呈現所有的座標系
figure>axes(座標系)>axis(座標軸)+tick+label+title
最外面是 畫布物件(裡面可以有子畫布也可以沒有)
畫布裡面有座標系
import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt
只含單一曲線的圖
x = np.arange(-np.pi,np.pi,0.1) y = np.sin(x) plt.plot(x,y) # 繪圖函式 預設繪製折線圖
包含多個曲線的圖
1、可以使用多個plot函式(推薦),在一個圖中繪製多個曲線
x1 = np.arange(-np.pi,0,0.1) plt.plot(x1,np.sin(x1)) x2= np.arange(0,np.pi,0.1) plt.plot(x2,np.sin(x2))
2、也可以在一個plot函式中傳入多對X,Y值,在一個圖中繪製多個曲線
x1 = np.arange(-np.pi,0,0.1) x2 = np.arange(0,np.pi,0.1) plt.plot(x1,np.sin(x1),x2,np.sin(x2)) # 也可以在一個plot函式中將多個 x和y的對應關係 連著寫
得到的結果與上圖一致
子畫布
axes = plt.subplot()
x = np.arange(-np.pi,np.pi,0.1)
axes1 = plt.subplot(2,2,1)# 引數1指的是把畫布縱向分成幾份 引數2指的是把畫布橫向分成幾份 引數3指的是佔用第幾個(從1開始) axes2 = plt.subplot(2,2,3) axes3 = plt.subplot(2,2,3) axes4 = plt.subplot(2,2,4) axes1.plot(x,np.sin(x)) # 座標系axes物件的plot方法 使用起來和之前的畫布fig的plot方法一樣 axes2.plot(x,np.cos(x)) axes3.plot(x,np.tan(x)) axes4.plot(x,np.sin(x)/np.cos(x)) # 如果subplot中指定的 座標系 有重疊 # 如果完全重疊 就花到同一個座標系裡面 # 如果沒有完全重疊 並且 位置上有衝突 後面的會把簽名的覆蓋
網格線
使用plt.grid方法可以開啟網格線,使用plt面向物件的方法,建立多個子圖顯示不同網格線
- axis顯示軸向
- color代表顏色
- alpha表示線的明暗程度
- lw代表linewidth,線的粗細
plt.plot() plt.grid() # 網格線
axes1 = plt.subplot(4,4,1) axes2 = plt.subplot(4,4,6) axes3 = plt.subplot(4,4,11) axes4 = plt.subplot(4,4,16) # 給子畫布中的圖 新增網格線 # plt.grid() # 使用plt呼叫grid只會給最後一個子畫布 新增網格線 (應該是讓axes物件去呼叫) axes1.grid(axis='x') # axis='both'指的是 x和y都會引出網格線 axes2.grid(axis='y') axes3.grid(color='red',alpha=0.3,linewidth=5) # axes.grid()
座標軸的軸線
plt.axis([xmin,xmax,ymin,ymax])
# axes 座標系 # axis 軸線 x = np.linspace(-1,1,100) y = (1-x**2)**0.5 plt.plot(x,y) plt.plot(x,-y) # plt.axis([-5,2,-2,10]) # [xmin, xmax, ymin, ymax] 可以控制x和y的顯示範圍 plt.axis([-1,1,-1,1])
plt.axis('xxx') 'off'、'equal'……
- 設定座標軸型別
- 關閉座標軸
x = np.linspace(-1,1,100) y = (1-x**2)**0.5 plt.plot(x,y) plt.plot(x,-y) # plt.axis([-5,2,-2,10]) # [xmin, xmax, ymin, ymax] 可以控制x和y的顯示範圍 plt.axis('equal') # 讓x和y的間距相等 plt.axis('off') # 去掉座標軸線
xlim方法和ylim方法
- 除了plt.axis方法,還可以通過xlim,ylim方法設定座標軸範圍
x = np.linspace(-1,1,100) y = (1-x**2)**0.5 plt.figure(figsize=(5,5)) # 設定畫布的大小 plt.plot(x,y) plt.plot(x,-y) # plt.xlim((-2,2)) # x軸的取值範圍 # plt.ylim((-2,2)) # y軸的取值範圍 plt.axis([-5,5,-5,5])
座標軸的標籤
plt.xlabel( )方法 和 plt.ylabel( )方法
例如 plt.ylabel('y = x^2 + 5',rotation = 60)
- color 標籤顏色
- fontsize 字型大小
- rotation 旋轉角度
x = np.arange(10) y = x**2+5 plt.plot(x,y) # plt.xlabel('x_label') # s string 字串 必須傳 x的標題 # plt.ylabel('y=x^2+5') # plt.ylabel('y=x^2+5',color='r',fontsize=20,rotation=45) # color顏色 fontsize字號 rotation旋轉 plt.xlabel('x_label',color='r',fontsize=20,rotation=45) plt.ylabel('y=x^2+5',color='r',fontsize=20,rotation=90,alpha=0.5) # y預設就是90度
畫布的標題
plt.title()方法
- loc 標題位置{left,center,right}
- color 標題顏色
- fontsize 字型大小
- rotation 旋轉角度
x = np.arange(10)
plt.plot(x,x) # plt.title('title') plt.title('標題',fontproperties='KaiTi',fontsize=20,color='red',alpha=0.3,rotation=45,loc='right') # 建議平時就使用英文 很多地方對中文支援都不好
圖例
legend方法
兩種傳參方法:
- 分別在plt.plot( )函式中增加label引數,再呼叫plt.legend( )方法顯示
- 直接在legend方法中傳入字串列表 如:plt.legend(['normal','fast','slow'])
x = np.arange(10) plt.plot(x,x) plt.plot(x,2*x) plt.plot(x,x/2) plt.legend(['normal','fast','slow']) # 列表中的順序 要和上面畫線的順序一樣
plt.plot(x,x,label='normal') plt.plot(x,2*x,label='fast') plt.plot(x,x/2,label='slow') plt.legend()
loc引數
- loc引數用於設定圖例的位置,一般在legend函式內
- matplotlib已經預定義好幾種數字表示的位置
loc引數還可以是2元素的列表,表示圖例左下角的座標
- [0,0] 左下
- [0,1] 左上
- [1,0] 右下
- [1,1] 右上
圖例也可以超過圖的界限loc = (-0.1,0.9)
data = np.random.randint(0,100,size=(10,3)) df = DataFrame(data,columns=list('ABC')) df plt.plot(df['A']) plt.plot(df['B']) plt.plot(df['C']) # plt.legend(['A','B','C'],loc=10) # 如果不設定 loc引數 預設 loc=0 best 尋找空間最大的最佳位置 # loc的值 除了 可以使用 預定義的0-10 之外 開可以以座標的形式 設定位置 # plt.legend(['A','B','C'],loc=[0,0]) # plt.legend(['A','B','C'],loc=[1,1]) # plt.legend(['A','B','C'],loc=[-0.5,1.5])
ncol引數
ncol控制圖例中有幾列,在legend中設定ncol,需要設定loc
data = np.random.randint(0,100,size=(10,3)) df = DataFrame(data,columns=list('ABC')) df plt.plot(df['A']) plt.plot(df['B']) plt.plot(df['C']) plt.legend(['A','B','C'],ncol=3) # ncol 用來指定有幾列
二、設定plot的風格和樣式
plot語句中支援除X,Y以外的引數,以字串形式存在,來控制顏色、線型、點型等要素,語法形式為:
plt.plot(X, Y, 'format', ...)
點和線的樣式
顏色
- 引數color或c
- 顏色值的方式
- 合法的HTML顏色名
- color = 'red'
- 別名
- color='r'
- HTML十六進位制字串
- color = '#eeefff'
- 歸一化到[0, 1]的RGB元組
- color = (0.3, 0.3, 0.4)
- 合法的HTML顏色名
x = np.linspace(-np.pi,np.pi,100) y = np.sinh(x) # plt.plot(x,y,color='red') # color屬性 設定線的顏色 後面的值是字串 可以跟 # plt.plot(x,y,c='red') # 引數名可以簡寫成c # plt.plot(x,y,c='b') # 引數值也可以簡寫 rgb光源的三原色(加光模式) cmy(減光模式)k(黑色) w白色 # plt.plot(x,y,c='#abcdef') plt.plot(x,y,c=(0.5,0.4,0.1))
透明度
plt.plot() 中的 alpha引數
plt.plot(x,y,c=(0.5,0.4,0.1),alpha=0.2)
線型和線寬
- 引數linestyle或ls
- linewidth或lw引數
x = np.linspace(0,10,11) x y = x plt.plot(x,y,c='orange',ls='steps',dashes=[2,4,6,8],alpha=0.8)
點型
- marker 設定點形
- markersize 設定點形大小
更多點和線的設定
- markeredgecolor = 'green',
- markeredgewidth = 2,
- markerfacecolor = 'purple'
同時設定多個曲線樣式
多個曲線同一設定
plt.plot(x1, y1, x2, y2,...,樣式引數)
plt.plot(x,x,x,2*x,x,x/2,color='r',ls=':',marker='.') # x1 y1 x2 y2 x3 y3 # 多對曲線 樣式一樣 可以 在最後 統一設定
多個曲線不同設定
多個都進行設定時,多引數連用
plt.plot(x1, y1, fmt1, x2, y2, fmt2, ...) fmt format 格式化字串
fmt = '[color][marker][line]'
plt.plot(x,x,'ro-',x,2*x,'b*:',x,x/2,'yd--') # fmt format 格式化字串
# fmt = '[color][marker][line]'
文件 https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib.pyplot.plot
曲線樣式的三種設定方式
向方法傳入關鍵字引數
plt.plot(...)
就是之前我們一直用的 呼叫plt.plot()繪圖的時候往裡面傳引數的方式
優點:簡潔方便
缺點:容易亂 沒提示 可讀性差
對例項使用一系列的setter方法
- plt.plot()方法返回一個包含所有線的列表,設定每一個線需要獲取該線物件
- eg: lines = plt.plot(); line = lines[0]
- line.set_linewidth()
- line.set_linestyle()
- line.set_color()
lines = plt.plot(x,x,x,2*x,x,x/2) lines[0].set_linestyle('--') lines[1].set_linewidth(5) lines[2].set_color('cyan')
對座標系使用一系列的setter方法
- axes = plt.subplot()獲取座標系
- axes.plot(...)
axes = plt.subplot() lines = axes.plot(x,x,x,2*x,x,x/2) lines[0].set_linestyle('--') lines[1].set_linewidth(5) lines[2].set_color('cyan')
axes物件文件 https://matplotlib.org/api/axes_api.html
lines物件文件 https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D
X、Y軸座標刻度
plt.xticks()和plt.yticks()方法
- 需指定刻度值和刻度名稱 plt.xticks([刻度列表],[名稱列表])
- 支援fontsize、rotation、color等引數設定
x = np.linspace(-np.pi,np.pi,100) x y = np.sin(x) plt.plot(x,y) # plt.xticks([-3,0,3]) # 以列表的形式傳入要顯示的刻度 # plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi],['-$\pi$','-$\pi$/2',0,'$\pi$/2','$\pi$']) # 第二個列表 可以傳 要顯示的名字 plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi],['-$\pi$','-$\pi$/2',0,'$\pi$/2','$\pi$'],fontsize=20,color='r',rotation=45) plt.yticks([1,0.5,0,-0.5,-1],['max',0.5,0,-0.5,'min']) plt.grid()
axes = plt.subplot(111) axes.plot(x,y) # axes.set_xticks([-3,0,3],['min',0,'max']) # set_xticks只能設定顯示哪些刻度 不能設定自定義名稱 axes.set_xticks([-3,0,3]) axes.set_xticklabels(['min',0,'max']) # 用這個可以設定 自定義名稱
# 儲存圖片 fig = plt.figure() x = np.linspace(0,99,100) x plt.plot(x) plt.plot(x.cumsum()) # fname filename 檔名 用來指定要儲存在哪裡 不指定字尾預設是png圖片 還可以是pdf svg # dpi dot per inch 清晰度 # facecolor圖片的背景顏色 fig.savefig('demo.png',dpi=100,facecolor='c') # 儲存影象