資料分析----Matplotlib

語言: CN / TW / HK

本文已參與「新人創作禮」活動,一起開啟掘金創作之路

基本佈局物件

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() ```

「其他文章」