1. 程式人生 > >Matplotlib 基本操作及基本案例

Matplotlib 基本操作及基本案例

Matplotlib 教程

(一)Matplotlib詳解

  • 在matplotlib中整個影象為一個Figure物件,可包括一個或者多個Axes物件 每個Axes(ax) 物件都是一個繪圖擁有自己座標系統的繪圖區域
  • Axis(line):是橫座標
  • Axis Label(text):橫座標姓名的標籤
  • Tick Label(text):設定橫座標的值
  • Title(text):圖名
  • Tick(text):同理,是縱座標的
  • 各個物件包含關係fig(ax(xaxis(tick(tick label),label),yaxis(tick(tick label),label),title,data))

title為影象標題,Axis為座標軸, Label為座標軸標註,Tick為刻度線,Tick Label為刻度註釋

常見繪相簿如下:

  • matplotlib
  • Seaborn
  • Bokeh: 互動式資料視覺化
  • Logistics Regression:分類預測和邏輯迴歸

(二)常用繪圖型別

(1)折線圖:plt() (2)柱狀圖:plt.bar(x,y) (3)散點圖:plt.scatter(x,y) (4)餅圖:plt.pie(x) (5)直方圖:plt.hist(x,y) (6)子圖:plt.subplot(x,y,z)

(三)基本函式解釋

(1)figure

  • figure:matplotlib建立的圖都在figure物件中,建立figure物件,plt.figure()

(2)Subplot:繪製子圖

  • fig.add_subplot(a,b,c):a,b代表將fig分割成a x b的區域,c代表當前選中要操作的區域,注意從1開始。

(3)自定義x軸刻度 :在matplotlib.ticker裡的MultipleLocator,FormatStrFormatter裡

  • 匯入包:
%python
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import
MultipleLocator,FormatStrFormatter
  • 數字格式:
%python
x = np.arange(30) #x取值
y = np.arange(30) #y取值
plt.figure(figsize=(5,3))
plt.plot(x,y)
#設定x刻度間隔
plt.gca().xaxis.set_major_locator(MultipleLocator(3))
#設定x軸的刻度顯示格式
plt.gca().xaxis.set_major_formatter(FormatStrFormatter('%d-N'))
#自動旋轉x刻度適應座標軸
plt.gcf().autofmt_xdate()
plt.title('Set_x_Format')
plt.show()

這裡寫圖片描述

  • 時間格式
%python
import numpy as np
import datetime
from matplotlib.dates import DayLocator,DateFormatter
x = [datetime.date.today() + datetime.timedelta(i) for i in range(30)]
y = np.sin(np.arange(30))
plt.plot(x,y)
#設定x軸的時間間隔有,MinuteLocator,HourLocator,DayLocator,WeekLocator,MonthLocator,YearLocator
plt.gca().xaxis.set_major_locator(DayLocator(interval=3))
plt.gca().xaxis.set_major_formatter(DateFormatter('%y/%m/%d'))
plt.gcf().autofmt_xdate()
plt.show()

這裡寫圖片描述

(4)繪製柱狀圖

%python
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(5) #x產生5組
y1,y2 = np.random.randint(1,25,size=(2,5)) #y1,y2隨機產生
width = 0.5 #代表柱狀圖的寬度 
ax = plt.subplot(1,1,1)
ax.bar(x,y1,width,color='r')   #bar 是繪製柱狀圖
ax.bar(x+width,y2,width,color='g') #設定x軸,y軸,寬度,顏色
ax.set_xticks(x+width)
# ax.set_xticklabels(['a','b','c','d','e']) #自定義x的刻度標籤的內容
plt.show()                   

width=0.5,沒有設定x的刻度標籤 這裡寫圖片描述 width=0.25,設定x的刻度標籤 這裡寫圖片描述

(5)矩陣繪圖

%python
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
m = np.random.rand(10,10) #隨機產生10x10的二維陣列
# print(m)
plt.imshow(m,interpolation='nearest',cmap=plt.cm.ocean)
plt.colorbar()
plt.show()

這裡寫圖片描述

(6)plt.subplots()

%python
fig ,subplot_arr = plt.subplots(2,2)
subplot_arr[0,0].hist(np.random.randn(100),bins=10,color='b',alpha=0.3)
plt.show()

這裡寫圖片描述

(7)常用顏色

    * b:blue
    * g:green
    * r:red
    * c:cyan
    * m:magenta
    * y:yellow
    * k:black
    * w:white

(8)x,y的刻度和標籤及取值範圍

  • 設定顯示的刻度 plt.xticks(),plt.yticks() ax.set_xticks(),ax.set_yticks()
  • 設定刻度標籤 ax.set_xticklabels(),ax.set_yticklabels()
  • 設定刻度範圍 plt.xlim(),plt.ylim() ax.set_xlim(),ax.set_ylime()
  • 設定座標軸標籤 ax.set_xlabel(),ax.set_ylabel()

案例引入:統計美國死亡率(1968-2010)

按年齡

%python
import csv 
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure(figsize = (15,13))
plt.ylim(35,102)
plt.xlim(1965,2015)
labeldata =['Below 25','25-44','45-54','55-64','65-74','75-84','Over 85']
with open('mortality2.csv') as csvfile:
    mortdata = [row for row in csv.reader(csvfile)]
x = []
for row in mortdata:
    yrval = int(row[0])
    if(yrval == 1969):
        y = [[row[1]],[row[2]],[row[3]],[row[4]],[row[5]],[row[6]],[row[7]]]
    else:
        for col in range(0,7):
            y[col] += [row[col+1]]
    x += [yrval]
for col in range(0,7):
    if(col == 1):
        plt.plot(x,y[col],label=labeldata[col],linewidth=3.8)
    else:
        plt.plot(x,y[col],label=labeldata[col],linewidth=2)
plt.legend(loc=0,prop={'size':10})
plt.show()

按性別

%python
import csv
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10,4)) #設定影象大小
plt.ylim(740,1128) #設定y軸的取值範圍
plt.xlim(1968,2011) #設定x軸的取值範圍
with open('mortality1.csv') as csvfile:
    mortdata=[row for row in csv.DictReader(csvfile)] #開啟檔案 DictReader() 是用欄位名作為鍵,欄位的值作為值
x = [] #x列表
males_y = [] #男性列表
females_y = [] #女性列表
every_y = [] #全部人
yrval = 1968 #起始的統計年份
for row in mortdata:
    x += [yrval] #將1968插入x列表
    males_y += [row['Males']] #將Males那列的第一個值放入males_y的列表中
    females_y += [row['Females']] #將Females那列放入females_y列表中
    every_y += [row['Everyone']] #同上
    yrval = yrval + 1   #起始年份+1

plt.plot(x,males_y)
plt.plot(x,females_y)
plt.plot(x,every_y)
plt.legend(loc=0,prop={'size':10})
plt.show()

致謝

[1]:《python資料視覺化》科斯.拉曼 (著)程豪(譯) 也有借鑑了別人的部落格,忘記了網址。。。。