資料分析----Matplotlib
本文已參與「新人創作禮」活動,一起開啟掘金創作之路
基本佈局物件
figure物件是所有圖表繪製的基礎 構建圖示的主要步驟 - 準備資料 - 生成圖表 - 傳入資料 - 調整圖示的裝飾
圖表樣式的修改以及圖表裝飾的介面
Matplotlib定義詳細的圖示裝飾項介面,能夠對圖表幾乎每一個細節進行修改 - 修改圖表樣式
```python import matplotlib.pyplot as plt import numpy as np fig = plt.figure() fig,axes = plt.subplots() t = np.arange(0,2,0.01) s = np.sin(2np.pit)
修改線條顏色,線條形式
axes.plot(t,s,color='k',linestyle='-') s = np.sin(2np.pi(t+0.5)) axes.plot(t,s,color='c',linestyle='--') plt.show() ``` 常用的color引數值 | color引數值|含義 | |--|--| |r |紅色 | | y| 黃色 | | g | 綠色 | | c | 青色 | | b | 藍色 | | m | 紫紅色 | | w| 白色| 常用linesstyle引數值 | linesstyle引數值|含義 | |--|--| | - | 實線 | | -- | 虛線(兩個短橫線)| | -. | 虛線(短橫線和點交替) | | : | 虛線(點) | - 修改裝飾項
```python import matplotlib.pyplot as plt import numpy as np fig = plt.figure() fig,axes = plt.subplots() t = np.arange(0,2,0.01) s = np.sin(2np.pit)
修改線條顏色,線條形式
axes.plot(t,s,color='k',linestyle='-',label='line1')
s = np.sin(2np.pi(t+0.5)) axes.plot(t,s,color='c',linestyle='--',label='line2')
ticks styles
axes.set_xticks(np.arange(0,2,0.5)) axes.set_yticks([-1,0,1]) axes.minorticks_on()
axes position
對邊框進行修改,隱藏右邊框和上邊框
axes.spines['right'].set_color('none') axes.spines['top'].set_color('none')
指定邊框的位置,第一個引數表示位置的種類,第二個引數表示邊框的位置
axes.spines['bottom'].set_position(('data',0))
axes.spines['left'].set_position(('data',0))
axes.spines['bottom'].set_position('center') axes.spines['left'].set_position('zero')
'center' 等於('data',0.5)
zero 等於 ('data',0)
legend
設定圖例,loc bbox_to_anchor 確定位置的引數
axes.legend(loc='upper right',bbox_to_anchor=(1.1,1)) plt.show() ``` - 添加註釋
```python import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure() fig,axes = plt.subplots() axes.plot(np.arange(0,24,2),[14,9,7,5,12,19,23,26,27,24,24,19],'-o') axes.set_xticks(np.arange(0,24,2))
生成一個帶箭頭的註釋
''' axes.annotate('hottest at 16:00',xy=(16,27),xytext=(16,22),arrowprops=dict( facecolor = 'black',shrink=0.2), horizontalalignment='center',verticalalignment='center' ) 引數依次是 註釋文字 xy 箭頭尖端位置 xytext 註釋文字位置 arrowprops=dict( 箭頭樣式引數 facecolor 箭頭顏色 shrink 箭頭與文字之間的距離 horizontalalignment verticalalignment 文字在水平位置和垂直位置向上對齊的方式
'''
axes.annotate('hottest at 16:00',xy=(16,27),xytext=(16,22),arrowprops=dict( facecolor = 'black',shrink=0.2), horizontalalignment='center',verticalalignment='center' ) ''' axes.text() 引數分別為 文字的位置 註釋文字 背景框的樣式(課可以指定, 背景顏色 透明度 文字與背景框之間的距離) ''' axes.text(12,10,'Date: March 26th 2018',bbox={'facecolor':'cyan','alpha':0.3,'pad':6}) plt.show() ```
基礎圖表繪製
直方圖
是一種直觀描述資料集集中每一個區間內資料值出現頻數的統計圖 通過直方圖,可以大致瞭解資料的分佈,判斷資料集中的區間 ```python import matplotlib.pyplot as plt import numpy as np data = np.random.standard_normal(1000)
分組
bins = 50 fig,axes = plt.subplots()
直方圖
axes.hist(data,bins) axes.set_title("Histogram") plt.show()
直方圖加標準正態密度函式影象
number_of_bins = 50 fig,axes = plt.subplots() n,bins ,patch=axes.hist(data,number_of_bins,density=True) standard_data = ((1/(np.sqrt(2np.pi)1))np.exp(-0.5(1/1(bins-0))*2)) axes.plot(bins,standard_data,0,'-') plt.show()
```
散點圖
可以將樣本資料繪製在二維平面上777直觀的顯示分佈情況,初步判斷兩個變數之間的關係
```python import matplotlib.pyplot as plt import numpy as np n = 60 np.random.seed(100) x = np.random.rand(n) y = np.random.rand(n)
plt.scatter(x,y)
fig,axes= plt.subplots() axes.scatter(x,y) plt.show()
根據值改變點大大小和顏色
n1 = 60 np.random.seed(100) x = np.random.rand(n1) y = np.random.rand(n1) s = np.pi(10np.random.rand(n1))**2
c= -s
plt.scatter(x,y)
fig,axes= plt.subplots()
x y 標記點面積,顏色,透明度
axes.scatter(x,y,s,c,alpha=0.7)
plt.show()
```
餅圖
餅圖可以直觀的顯示某一類資料在全部樣本資料的百分比
python
import matplotlib.pyplot as plt
import numpy as np
fig,axes = plt.subplots()
labels = 'Taxi','Metro','Walk','Bus','Bicycle','Driving'
sizes = [10,30,5,25,5,25]
explode = (0,0.1,0,0,0,0)
axes.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=True,startangle=90)
axes.axis('equal')
axes.set_title('pie chart')
plt.show()
柱狀圖
柱狀圖可以直觀的反應不同類別資料之間分佈情況的數量差異
python
import matplotlib.pyplot as plt
import numpy as np
fig,axes = plt.subplots()
data_m=(40,120,20,100,30,200)
data_f=(60,180,30,150,20,50)
index = np.arange(6)
width = 0.4
axes.bar(index,data_m,width,color='c',label='men')
axes.bar(index+width,data_f,width,color='b',label='women')
axes.set_xticks(index+width/2)
axes.set_xticklabels(('Taxi','Metro','Walk','Bus','Bicycle','Driving'))
axes.legend()
plt.show()
```python
柱狀圖疊加效果,將兩個柱狀圖疊加顯示
fig,axes = plt.subplots()
data_m=(40,120,20,100,30,200)
data_f=(60,180,30,150,20,50)
width = 0.4
axes.bar(index,data_m,width,color='c',label='men')
axes.bar(index,data_f,width,color='b',bottom=data_m,label='women')
axes.set_xticks(index+width/2)
axes.set_xticks(index+width/2)
axes.set_xticklabels(('Taxi','Metro','Walk','Bus','Bicycle','Driving'))
axes.legend()
plt.show()
```
```python
柱狀圖半重疊
fig,axes = plt.subplots() data_m=(40,120,20,100,30,200) data_f=(60,180,30,150,20,50) width = 0.4 axes.bar(index,data_m,width,color='c',label='men',align='center') axes.bar(index,data_f,width,color='b',label='women',align='edge') axes.set_xticks(index+width/2) axes.set_xticks(index+width/2) axes.set_xticklabels(('Taxi','Metro','Walk','Bus','Bicycle','Driving')) axes.legend() plt.show()
```
```python
水平柱狀圖
fig,axes = plt.subplots() data_m=(40,120,20,100,30,200) data_f=(60,180,30,150,20,50) width = 0.4 axes.barh(index,data_m,width,color='c',label='men',align='center',alpha=0.4) axes.barh(index,data_f,width,color='b',label='women',align='edge',alpha=0.4) axes.set_yticks(index+width/2) axes.set_yticklabels(('Taxi','Metro','Walk','Bus','Bicycle','Driving')) axes.legend() plt.show()
```
折線圖
折線圖可以看出資料的變化趨勢
python
import matplotlib.pyplot as plt
import numpy as np
fig,axes = plt.subplots()
x = np.arange(10)
y1 = np.random.rand(10)
y2 = np.random.rand(10)
axes.plot(x,y1,'-o',color='c')
axes.plot(x,y2,'--o',color='b')
plt.show()
表格
通過表和圖的結合,既可以直觀的看到資料的分佈情況,也能看到詳細的資料 ```python import matplotlib.pyplot as plt import numpy as np fig,axes = plt.subplots() data_m=(40,120,20,100,30,200) data_f=(60,180,30,150,20,50) width = 0.4 index = np.arange(6) axes.bar(index,data_m,width,color='c',label='men') axes.bar(index,data_f,width,color='b',bottom=data_m,label='women') axes.set_xticks([]) axes.legend()
表格
data=(data_m,data_f)
rows =('male','female')
columns = 'Taxi','Metro','Walk','Bus','Bicycle','Driving'
axes.table(cellText=data,rowLabels=rows,colLabels=columns)
plt.show()
```
不同座標系下的圖象
```python import matplotlib.pyplot as plt import numpy as np
雙扭線
fig,axes = plt.subplots() theta_list = np.arange(0,2np.pi,0.01) r = [2np.cos(2*theta) for theta in theta_list]
polar 極座標系
建立一個投影為極座標的axes
axes = plt.subplot(projection='polar')
使用plot函式生成函式曲線,
axes.plot(theta_list,r)
為了美觀刪除r軸上所有的刻度
axes.set_rticks([])
plt.show()
```
matplotlib3D
```python import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() axes = Axes3D(fig)
設定隨機種子
np.random.seed(100)
x = np.random.rand(60)
y = np.random.rand(60)
z = np.random.rand(60)
axes.scatter(x,y,x)
plt.show()
```
```python
使用pyplot實現
fig = plt.figure() axes = plt.subplot(projection="3d") x = np.random.rand(80) y = np.random.rand(80) z = np.random.rand(80) axes.scatter(x,y,x) plt.show() ```