1. 程式人生 > >資料分析庫之matplotlib

資料分析庫之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)

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')  # 儲存影象