matplotlib

matplotlib架構

matplotlib架構分爲三層:各層之間單向通訊,即每一層只能與它的下一層通訊,而下層沒法與上層通訊。編程

  • Scripting(腳本)層:後端

  • Artist(變現層):數組

  • Backend(後端層):網絡

Backend層

  • 在matplotlib的架構中,最下面一層爲 Backend層。 matplotlib API即位於該層,這些是用來在底層實現圖形元素的一個個類。架構

  • FigureCanvas對象實現了繪圖區域這一律念。框架

  • Renderer對象在 Figure Canvas上繪圖dom

  • Event對象處理用戶輸入(鍵盤和鼠標事件)。ide

Artist層

  • 中間層爲 Artist,層。圖形中全部能看到的元素都屬於 Artist對象,即標題、軸標籤、刻度等組成圖形的全部元素都是 Artis對象的實例。函數

  • Artist類分爲兩種:原始(primitive)和複合(composite)工具

  • 繪製Line2D或矩形、圓形等幾何圖形,甚至文本等圖形時,造成圖形表示的基礎元素由primitive artist單個對象組成。

  • 由多個基礎元素primitive artist組成的圖表中的圖像元素叫做 composite artist,

  • Figure對象在 Artist層的最上面,對應整個圖形表示,一般可包含多條軸(Axes)

  • Axes對象一般表示圖形或圖表是對什麼內容進行做圖的。每一個Axes對象只屬於一個Figure對象,由兩個(三維就有三個) Artist axis對象組成。標題、x標籤和y標籤等對象都屬於Axes這個composite artist類型的對象。

  • Axis對象負責展現在Axes對象上面的數值,定義數值範圍,管理刻度(軸上的標記)和刻度值標籤(表明每一個刻度大小的文本標籤)。刻度的位置用 Locator對象調整,刻度標籤的格式用Formatter對象調整。

Scripting層(pyplot)

  • plab模塊跟 matplotlib一塊兒安裝,而pyplot則是 matplotlib的內部模塊。二者的導入方法也有所不一樣,可選擇其中一種進行導入。
from pylab import *

import matplotlib.pyplot as plt

import numpy as np
  • pylab在同一命名空間整合了 pyplot和 NumPy的功能,所以無需再單獨導入 NumPy。更進一步來講,導人 pylab後, pyplot和 NumPy的函數就能夠直接調用,而不用再指定其所屬模塊(命名空間),從而使得 matplotlib開發環境更像是 Matlab。

  • pyplot模塊提供操做 matplotlib庫的經典 Python編程接口,有着本身的命名空間,須要單獨導入NumPy庫

pyplot

  • 經過pyplot函數能夠操做或改動 Figure對象,例如建立 Figure對象和繪圖區域、表示一條線或爲圖形添加標籤等。

  • pyplot還具備狀態性特性,它能跟蹤當前圖形和繪圖區域的狀態。調用函數時,函數只對當前圖形起做用。

  • 生成一幅簡單的交互式圖表

import matplotlib.pyplot as plt

plt.plot([1,2,3,4,5])

plt.show()

設置圖形的屬性

1.用紅點來表示每一對(x,y)

import matplotlib.pyplot as plt

plt.plot([1,2,3,4],[1,4,9,16],'ro')

plt.show()

2.title()函數增長標題。

plt.axis([0,5,0,20])

plt.title('The first')

plt.plot([1,2,3,4],[1,4,9,16],'ro')

plt.show()

3.如何在同一圖形中繪製三種不一樣的趨勢圖.

使用 kwargs

  • 組成圖表的各個對象有不少用以描述它們特色的屬性。這些屬性均有默認值,但能夠用關鍵字參數設置。

這些關鍵字做爲參數傳遞給函數。在matplotlib庫各個函數的參考文檔中,每一個函數的最後個參數老是 kwargs。

matplotlib.pyplot.plot(*args, **kwargs)
  • linewidth關鍵字參數,能夠改變線條的粗細。

處理多個 Figure和Axes對象

  • 能夠同時管理多個圖形,而在每一個圖形中,又能夠繪製幾個不一樣的子圖。

所以,使用 pyplot時,必須時刻注意當前 Figure對象和當前Axes對象的概念(也就是 Figure對象中當前所顯示的圖形)

  • 一幅圖形中有兩個子圖

  • subplot(函數不只能夠將圖形分爲不一樣的繪圖區域,還能激活特定子圖,以便用命令控制它。

  • subplot()函數用參數設置分區模式和當前子圖。只有當前子圖會受到命令的影響。

  • subplot()函數的參數由三個整數組成:第一個數字決定圖形沿垂直方向被分爲幾部分,第二個數字決定圖形沿水平方向被分爲幾部分,第三個數字設定能夠直接用命令控制的子圖。

  • 把畫布分爲上下兩個向水平方向延伸的子圖

import matplotlib.pyplot as plt

import numpy as np

t = np.arange(0,5,0.1)

y1= np.sin(2*np.pi*t)

y2= np.sin(2*np.pi*t)

plt.subplot(211)

plt.plot(t, y1, 'b-')

plt.subplot(212)

plt.plot(t,y2, 'r--')

plt.show()
  • 把圖形分爲左右兩個子圖。
t = np.arange(0,5,0.1)

y1= np.sin(2*np.pi*t)

y2= np.sin(2*np.pi*t)

plt.subplot(121)

plt.plot(t, y1, 'b-')

plt.subplot(122)

plt.plot(t,y2, 'r--')

plt.show()

添加文本

  • xlabe()和 ylabel()函數專門用於添加軸標籤。把要顯示的文本以字符串形式傳給這兩個函數做爲參數。
plt.axis([0,5,0,20])

plt.title('The first')

plt.xlabel('Counting')

plt.ylabel('Square Values')

plt.plot([1,2,3,4],[1,4,9,16],'ro')

plt.show()

改變字體、字號和軸標籤顏色

plt.axis([0,5,0,20])

plt.title('The first',fontsize=20,fontname='Times New Roman' )

plt.xlabel('Counting',color='gray' )

plt.ylabel('Square Values',color='gray')

plt.plot([1,2,3,4],[1,4,9,16],'ro')

plt.show()
  • pyplot容許你在圖表任意位置添加文本。這個功能由text()函數來實現.
text(x, y, s, fontdict=None, **kwargs)
  • 前兩個參數爲文本在圖形中位置的座標。s爲要添加的字符串, fontdict(可選)爲文本要使用的字體。最後,還可使用關鍵字參數。

爲圖形的各個數據點添加標籤。

  • text()函數的前兩個參數爲標籤在圖形中位置的座標,因此咱們可使用四個數據點的座標做爲各標籤的座標,但每一個標籤的y值較相應數據點的y值有一點誤差。
plt.axis([0,5,0,20])

plt.title('The first',fontsize=20,fontname='Times New Roman' )

plt.text(1,1.5,'first')

plt.text(2,4.5,'second')

plt.text(3,9.5,'third')

plt.text(4,16.5,'fourth')

plt.xlabel('Counting',color='gray' )

plt.ylabel('Square Values',color='gray')

plt.plot([1,2,3,4],[1,4,9,16],'ro')

plt.show()

添加公式

  • matplotlib整合了LaTeX表達式,支持在圖表中插入數學表達式。

將表達式內容置於兩個符號之間,可在文本中添加 LaTeX表達式。解釋器會將該符號之間的文本識別成 LaTex表達式,把它們轉換爲數學表達式、公式、數學符號或希臘字母等,而後在圖像中顯示出來。一般,須要在包含LaTeX表達式的字符串前添加r字符,代表它後面是原始文本,不能對其進行轉義操做。

plt.axis([0,5,0,20])

plt.title('The first',fontsize=20,fontname='Times New Roman' )

plt.text(1,1.5,'first')

plt.text(2,4.5,'second')

plt.text(3,9.5,'third')

plt.text(4,16.5,'fourth')

plt.text(1.1,12, r'$y = x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha': 0.2})#添加公式

plt.xlabel('Counting',color='gray' )

plt.ylabel('Square Values',color='gray')

plt.plot([1,2,3,4],[1,4,9,16],'ro')

plt.show()

添加網格

plt.grid(True)

添加圖例

  • legend()函數,用於操做該類對象。
plt.axis([0,5,0,20])

plt.title('The first',fontsize=20,fontname='Times New Roman' )

plt.text(1,1.5,'first')

plt.text(2,4.5,'second')

plt.text(3,9.5,'third')

plt.text(4,16.5,'fourth')

plt.text(1.1,12, r'$y = x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha': 0.2})

plt.grid(True)

plt.xlabel('Counting',color='gray' )

plt.ylabel('Square Values',color='gray')

plt.plot([1,2,3,4],[1,4,9,16],'ro')

plt.legend(['first serises'])

plt.show()
  • 若是要修改圖例的位置,仍是須要添加幾個關鍵字參數。例如,圖例的位置由loc關鍵字控制,其取值範圍爲0~10。每一個數字表明圖表中的

一處位置,默認爲1,也就是右上角位置。

0:最佳位置

1:右上角

2:左上角

3:右下角

4:左下角

5:右側

6:左側垂直居中

7:右側垂直居中

8:下方水平居中

9:上方水平居中

10:正中間

注意:一般,圖例經過標籤、顏色和(或)符號向讀者代表這是哪個序列,應該與其餘序列區分開來。在前面全部的例子中,咱們只使用了由一個p1ot()函數繪製的單個序列。

  • 在一幅圖中同時顯示多個序列。圖表中每一個序列用一種特定的顏色和符號來表示。從代碼實現的角度來看,每一個序列都要調用一次plot()函數,調用順序跟傳給 legend()函數做爲參數的文本標籤順序應保持一致。
plt.axis([0,5,0,20])

plt.title('The first',fontsize=20,fontname='Times New Roman' )

plt.text(1,1.5,'first')

plt.text(2,4.5,'second')

plt.text(3,9.5,'third')

plt.text(4,16.5,'fourth')

plt.text(1.1,12, r'$y = x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha': 0.2})

plt.grid(True)

plt.xlabel('Counting',color='gray' )

plt.ylabel('Square Values',color='gray')

plt.plot([1,2,3,4],[1,4,9,16],'ro')

plt.plot([1,2,3,4],[0.8,3.5,8,15],'g^')

plt.plot([1,2,3,4],[0.5,2.5,4,12],"b*")

plt.legend(['first series','second series','third series'],loc=2)

plt.show()

保存圖表

  1. 保存代碼

  2. 將回話轉化成HTML

  3. 將圖表直接轉化成圖片

plt.savefig('mychart.png')

注意:保存成圖像的命令以前不要使用plt.show(),不然將獲得空白圖像。

處理日期值

import datetime

events=[datetime.date(2015, 1, 23),

datetime.date(2015, 1, 28),

datetime.date(2015, 2, 3),

datetime.date(2015, 2, 21),

datetime.date(2015, 3, 15),

datetime.date(2015, 3, 24),

datetime.date(2015, 4, 8),

datetime.date(2015, 4, 24)]

readings=[12,22,25,20,18,15,17,14]

plt.plot(events, readings)

plt.show()
  • 若是讓 matplotlib自動管理刻度,尤爲是刻度的標籤,其後果無疑是一場災難。以這種方式顯示日期時,可讀性不好,兩個數據點之間的時間間隔不清晰,而且還存在重影現象。建議用合適的對象,定義時間尺度來管理日期。

  • 首先須要導入matplotlib.dates模塊,該模塊專門用於管理日期類型的數據。而後,定義時間尺度。下面例子中,用 Monthlocator()和 DayLocator()函數,分別表示月份和日子。

  • 日期格式也很重要,要避免出現重影問題或顯示無效的日期數據,只顯示必要的刻度標籤就好。咱們這裏只顯示年月,把這種格式做爲參數傳給

DateFormatter()函數。

  • 定義好兩個時間尺度,一個用於日期,一個用於月份。你能夠在 xaxis對象上調用 set_major_locator()函數和set_minorl_orator()函數,爲x軸設置兩種不一樣的標籤。此外,月份刻度標籤的設置,須要用到 set_major_formatter()函數。
import datetime

import numpy as np

import matplotlib. pyplot as plt

import matplotlib.dates as mdates

months = mdates.MonthLocator()

days= mdates. DayLocator()

timeFmt = mdates.DateFormatter('%Y-%m')

events = [datetime. date(2015, 1, 23),

datetime.date(2015, 1, 28),

datetime.date(2015, 2, 3),

datetime.date(2015, 2, 21),

datetime.date(2015, 3, 15),

datetime.date(2015, 3, 24),

datetime.date(2015, 4, 8),

datetime.date(2015, 4, 24)]

readings=[12,22,25,20,18,15,17,14]

fig, ax= plt.subplots()

plt.plot(events, readings)

ax.xaxis.set_major_locator(months)

ax.xaxis.set_major_formatter(timeFmt)

ax.xaxis.set_minor_locator( days)

plt.show()

圖表類型

線性表

y=sin(3*x)/x 圖像

import matplotlib.pyplot as plt

import numpy as np

x = np.arange(-2*np.pi,2*np.pi,0.01)

y=np.sin(3*x)/x

plt.plot(x,y)

plt.show()

y=sin(n* x)/x的圖像

x = np.arange(-2*np.pi,2*np.pi,0.01)

y=np.sin(3*x)/x

y1=np.sin(4*x)/x

y2=np.sin(5*x)/x

plt.plot(x,y)

plt.plot(x,y1)

plt.plot(x,y2)

plt.show()
  • 能夠用plot(函數的第三個參數指定顏色/線型,把這些設置所用的字符編碼放到同一個字符串便可。

  • 還可使用兩個單獨的關鍵字參數,用 color指定顏色,用 linestyle指定線型

| 編碼 | 顏色 |

| :--- | :--- |

| b | 藍色 |

| g | 綠色 |

| r | 紅色 |

| c | 藍綠色 |

| m | 洋紅 |

| y | 黃色 |

| k | 黑色 |

| w | 白色 |

  • x軸的數值範圍爲-2π~2π,可是刻度標籤默認使用數值形式須要用π的倍數代替數值。

  • 同理,能夠替換y軸刻度的標籤。方法是使用 sticks()和 sticks()函數,分別爲每一個函數傳入兩列數值。第一個列表存儲刻度的位置,第二個列表存儲刻度的標籤。

import matplotlib.pyplot as plt

import numpy as np

x = np.arange(-2*np.pi,2*np.pi,0.01)

y=np.sin(3*x)/x

y1=np.sin(4*x)/x

y2=np.sin(5*x)/x

plt.plot(x,y,color='b')

plt.plot(x,y1,color='r')

plt.plot(x,y2,color='g' )

plt.xticks([-2*np.pi,-np.pi,0,np.pi,2*np.pi],

    [r'$-2\pi$',r'$-\pi$',r'$0$',r'$+\pi$',r'$+2pi$'])

plt.yticks([-1,0,+1,+2,+3],

    [r'$-1$',r'$ 0 $',r'$+1$',r'$+2$',r'$+3$'])

plt.show()
  • 前面的全部線性圖中,x軸和軸老是置於 Figure的邊緣(跟圖像的邊框重合)

  • 另一種顯示軸的方法是,兩條軸穿過原點(0,0),也就是笛卡兒座標軸。

  • 具體作法是,首先必須用gca()函數獲取Axes對象。接着經過這個對象,指定每條邊的位置:右、左、下和上,可選擇組成圖形邊框的每條邊。使用 set_color()函數,把顏色設置爲none,刪除跟座標軸不符合的邊(右和上)。而後,用 set_position()函數移動跟x軸和軸相符的邊框,使其穿過原點(0,0)

ax.spines['right']. set_color('none')

ax.spines['top'].set_color('none')

ax.xaxis.set_ticks_position('bottom')

ax.spines['bottom'].set_position(('data', 0))

ax.yaxis.set_ticks_position('left')

ax.spines['left'].set_position(('data',0))

添加公式註釋

  • 用註釋和箭頭(可選)明曲線上某一數據點的位置,這一功能很是有用。例如,能夠用 LaTeX表達式做爲註釋,好比添加表示x趨於0時函數 sinx/x的極限的公式。

  • matplotlib庫的 annotate()函數特別適用於添加註釋。雖然它有多個關鍵字參數,這些參數可改善顯示效果,可是參數設置略顯繁瑣,也就使得 annotate()函數看似有些麻煩。

  • 第一個參數爲含有 LaTex表達式、要在圖形中顯示的字符串;

  • 隨後是各類關鍵字參數。註釋在圖表中的位置用存放數據點[x,y]座標的列表來表示,需把它們傳給xy關鍵字參數。

  • 文本註釋跟它所解釋的數據點之間的距離用xytext關鍵字參數指定,用曲線箭頭將其表示出來。

  • 箭頭的屬性則由arrowprops關鍵字參數指定。

plt.annotate(r'$\lim_{x\to 0}\frac{\sin()}{x}= 1$', xy=[0, 1], xycoords='data',

xytext=[30, 30], fontsize=16, textcoords='offset points', arrowprops=dict(arrowstyle="->",

connectionstyle="arc, rad= 2"))

爲pandas數據繪製線形圖

-將DataFrame中的數據作成線性圖表很簡單,只需把 DataFrame做爲參數傳入plot()函數,就能獲得多序列線性圖。

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

data = {

'series1':[1,3,4,3,5],

'series2':[2,4,5,2,4],

'series3':[3,2,3,1,3]}

df = pd.DataFrame(data)

x = np.arange(5)

plt.axis([0,5,0,7])

plt.plot(x,df)

plt.legend(data,loc=2)

plt.show()

直方圖

  • pyplot用於繪製直方圖的函數爲hist(),該函數具備一個其餘繪圖函數所沒有的功能。它除了繪製直方圖外,還以元組形式返回直方圖的計算結果。事實上,hist()函數還能夠實現直方圖的計算。也就是說,它可以接收一系列樣本個體和指望的面元數量做爲參數,會把樣本範圍分紅多個區間(面元),而後計算每一個面元所包含的樣本個體的數量。運算結果除了以圖形形式表示外,還能以元組形式返回。

  • 例子

pop = np.random.randint(0,100,100)

n,bins,patches = plt.hist(pop,bins=20)

plt.show()

條狀圖

  • x軸表示的不是數值而是類別。用 matplotlib的bar()函數生成條狀圖很簡單。
index = [0,1,2,3,4]

values = [5,7,3,4,6]

plt.bar(index,values)

plt.show()
  • 因爲每一個長條對應的是一種類別,最好用刻度標籤標明其類別,方法是把表示各個類別的字符串傳遞給 xticks()參數。
index = np.arange(5)

values = [5,7,3,4,6]

plt.bar(index,values)

plt.xticks(index,['A','B','C','D','E'])

plt.show()
  • 還能夠藉助不少其餘步驟進一步改進條狀圖。每一種改進方法都是經過在bar()函數中添加特定的關鍵字參數來實現的。

  • 例如,把包含標準差的列表傳給yerr關鍵字參數,就能添加標準差。這個參數常跟error_kw參數一塊兒使用,然後者又接收其餘可用於顯示偏差線的關鍵字參數。

  • 經常使用的兩個是 eColor和 capsize, eColor指定偏差線的顏色,而 capsize指定偏差線兩頭橫線的寬度。

  • 還有一個參數叫做 alpha,它控制的是彩色條狀圖的透明度。 alpha的取值範圍爲0-1。0表示對象徹底透明,隨着alpha值的增長,對象逐漸清晰起來,到1時,顏色顯示全了。

  • 帶有偏差線的條狀圖

index = np.arange(5)

values = [5,7,3,4,6]

std1 = [0.8,1,0.4,0.9,1.3]

plt.title('A bar Chart')

plt.bar(index,values,yerr=std1,error_kw={'ecolor':'0.1',

    'capsize':6},alpha=0.7,label='First')

plt.xticks(index,['A','B','C','D','E'])

plt.show()

水平條狀圖

  • 實際上還有水平方向的條狀圖。這種模式的條狀圖用barh()函數實現。bar()函數的參數和關鍵字參數對該函數依然有效。惟一須要注意的是,兩條

軸的用途跟垂直條狀圖恰好相反。水平條狀圖中,類別分佈在軸上,數值顯示在x軸。

index = np.arange(5)

values = [5,7,3,4,6]

std1 = [0.8,1,0.4,0.9,1.3]

plt.title('A Horizontal bar Chart')

plt.barh(index,values,xerr=std1,error_kw={'ecolor':'0.1',

    'capsize':6},alpha=0.7,label='First')

plt.yticks(index,['A','B','C','D','E'])

plt.show()

多序列條狀圖

  • 把每一個類別佔據的空間(方便起見,寬度爲1)分爲多個部分。想顯示幾個長

條,就將其分爲幾部分。建議再增長一個額外的空間,以便區分兩個相鄰的類別。

index = np.arange(5)

values1 = [5,7,3,4,6]

values2 = [6,6,4,5,7]

values3 = [5,6,5,4,6]

bw = 0.3

plt.axis([0,5,0,8])

plt.title('A Multiseries Bar Chart',fontsize=20)

plt.bar(index,values1,bw,color='b')

plt.bar(index+bw,values2,bw,color='g')

plt.bar(index+2*bw,values3,bw,color='r')

plt.xticks(index+1.5*bw,['A','B','C','D','E'])

plt.show()
  • 多序列水平條狀圖的生成方法也很簡單。用barh()函數替換bar()函數,同時 ticks()函數替換爲xticks()函數。此外,還須要交換axis()函數的參數中兩條軸的取值範圍。
index = np.arange(5)

values1 = [5,7,3,4,6]

values2 = [6,6,4,5,7]

values3 = [5,6,5,4,6]

bw = 0.3

plt.axis([0,8,0,5])

plt.title('A Multiseries Bar Chart',fontsize=20)

plt.barh(index,values1,bw,color='b')

plt.barh(index+bw,values2,bw,color='g')

plt.barh(index+2*bw,values3,bw,color='r')

plt.yticks(index+1.5*bw,['A','B','C','D','E'])

plt.show()

爲pandas DataFrame繪製堆積條狀圖

data = {

'series1':[1,3,4,3,5],

'series2':[2,4,5,2,4],

'series3':[3,2,3,1,3]}

df = pd.DataFrame(data)

df.plot(kind='bar',stacked=True)

plt.show()

其餘條狀圖

  • 另一種很是有用的圖形表示法是用條狀圖表現對比關係。兩列有着共同類別的數據,其條狀圖形分列於x軸兩側,沿y軸方向生長。

  • 要生成這類圖形,需事先對其中一個序列的y值進行取相反數操做

  • 如何修改條狀圖的邊框和條狀圖內部區域的顏色。其實,只要用另外兩個關鍵字參數 facecolor和 edgecolor設置兩種不一樣的顏色便可。

  • 如何在每一個長條的末端顯示ν值標籤,這有助於加強條狀圖的可讀性。可使用for循環,在循環體內再借助text()函數顯示y值標籤。標籤的位置可用ha和va關鍵字參數來調整,它們分別控制着標籤在水平和垂直方向上的對齊效果。

x0 = np.arange(8)

y1 = np.array([1,3,4,6,4,3,2,1])

y2 = np.array([1,2,3,4,3,3,2,1])

plt.ylim(-7,7)

plt.bar(x0,y1,0.9,facecolor='r',edgecolor='w')

plt.bar(x0,-y2,0.9,facecolor='b',edgecolor='w')

plt.xticks(())

plt.grid(True)

for x ,y in zip(x0,y1):

    plt.text(x+0.4,y+0.05,'%d' %y,ha='center',va='bottom')

for x ,y in zip(x0,y2):

    plt.text(x+0.4,-y-0.05,'%d' %y,ha='center',va='top')

plt.show()

餅圖

  • 餅圖也能夠用來表示數據。用pie(函數製做餅圖很簡單。

  • 該函數仍然以要表示的一列數據做爲主要參數。這裏直接選用百分比(總和爲100),能夠選用每種類別的實際數值,而讓pie(函數本身去計算每一個類別所佔的比例。

  • 對於這類圖表,仍需用關鍵字參數設置關鍵特徵。例如,若要定義顏色列表,爲做爲輸入的數據序列分配顏色,可以使用 colors關鍵字參數,把顏色列表賦給它。另一個重要的功能是爲餅圖的每一小塊添加標籤,爲此需使用 labels關鍵字參數,把標籤列表賦給它。此外,爲了繪製標準的圓形餅圖,還須要在代碼最後調用axis()函數,用字符串' equal'做爲參數。

labels=['Nokia','Samsung','Apple', 'Lumia']

values=[10,30,45,15]

colors=['yellow','green','red', 'blue']

plt.pie(values,labels=labels,colors=colors)

plt.axis('equal')

plt.show()
  • 爲了加強餅圖的表現力,還能夠製做從圓餅中抽取出一塊的效果。要突出顯示 Nokia這一塊,則須要使用 explode關鍵字參數。它的數據類型爲浮點型,取值範圍爲0~1。1表示這一塊徹底脫離餅圖;0表示沒有抽取,也就是餅圖仍

然是一個完整的圓;而0~1的值則表示這一塊未徹底脫離餅圖。

  • 能夠用 title(函數爲餅圖添加標題。還能夠用 Istartangle關鍵字參數調整餅圖的旋轉角度,該參數接收一個0-360的整數,表示轉換的角度(默認值爲0)。
labels=['Nokia','Samsung','Apple', 'Lumia']

values=[10,30,45,15]

colors=['yellow','green','red', 'blue']

explode = [0.3,0,0,0]

plt.title('A Pie Chart')

plt.pie(values,labels=labels,colors=colors,explode=explode,startangle=180)

plt.axis('equal')

plt.show()
  • 用autopct關鍵字參數,在每一塊的中間位置添加文本標籤來顯示百分比。

  • 能夠用 shadow關鍵字參數添加陰影效果,將其置爲True便可

plt.pie(values,labels=labels,colors=colors,explode=explode,startangle=180,shadow=True,autopct='%1.1f%%')

爲DataFrame繪製餅圖

data = { 'series1':[1,3,4,3,5],

'series2':[2,4,5,2,4],

'series3':[3,2,3,1,3]}

df = pd.DataFrame(data)

df['series1'].plot(kind='pie',figsize=(6,6))

plt.show()

高級圖表

等值線圖

  • 等值線圖或等高線圖在科學界很經常使用。這種可視化方法用由一圈圈封閉的曲線組成的等值線圖表示三維結構的表面,其中封閉的曲線表示的是一個個處於同一層級或z值相同的數據點。雖然等值線圖看上去結構很複雜,其實用 matplotlib實現起來並不難。首先,你須要用z=f(xy)函數生成三維結構。而後,定義x、y的取值範圍,肯定要顯示的區域。以後使用(xy)函數計算每一對(xy)所對應的z值,獲得一個z值矩陣。最後,用 Contour()函數生成三維結構表面的等值線圖。

  • 定義顏色表,爲等值線圖添加不一樣顏色,效果每每會更好;也就是說,用漸變色填充由等值線劃分紅的區域。

dx = 0.01

dy = 0.01

x = np.arange(-2.0,2.0,dx)

y = np.arange(-2.0,2.0,dy)

X,Y = np.meshgrid(x,y)

def f(x,y):

    return (1-y**5+x**5)*np.exp(-x**2-y**2)

C = plt.contour(X,Y,f(X,Y),8,color='black')

plt.contourf(X,Y,f(X,Y),8)

plt.clabel(C,inline=1,fontsize=10)

plt.show()
  • cmap關鍵字參數決定了顏色的種類

  • colorbar()函數增長圖例做爲對圖表中所用顏色的說明

dx = 0.01

dy = 0.01

x = np.arange(-2.0,2.0,dx)

y = np.arange(-2.0,2.0,dy)

X,Y = np.meshgrid(x,y)

def f(x,y):

    return (1-y**5+x**5)*np.exp(-x**2-y**2)

C = plt.contour(X,Y,f(X,Y),8,color='black')

plt.contourf(X,Y,f(X,Y),8,cmap=plt.cm.hot)

plt.clabel(C,inline=1,fontsize=10)

plt.colorbar()

plt.show()

極區圖

  • 這種圖表由一系列呈放射狀延伸的區域組成,其中每塊區域佔據必定的角度。所以若要用極區圖表示兩個不一樣的數值,分別指定它們在極區圖中所佔的份量:每塊區域的半徑r和它所佔的角度,其實這就是極座標(r,θ),是在座標軸系中表示數據的另外一種方法。

  • 自定義任意的顏色列表,方法是指定顏色列表,其中每一個元素爲字符

串類型的RGB編碼,其格式爲#rrggbb

N = 8

theta = np.arange(0.,2*np.pi,2*np.pi/N)

radii = np.array([4,7,5,3,1,5,6,7])

plt.axes([0.025,0.025,0.95,0.95],polar=True)

colors = np.array(['#4bb2c5',"#c5b47f","#EAAA28","#579575",'#839557',"#958c12",

'#953579',"#4b5de4"])

bars = plt.bar(theta,radii,width=(2*np.pi/N),bottom=0.0,color=colors)

plt.show()
  • 雖然定義了一列#rggb格式的顏色值,其實還能夠用顏色的實際名稱來表示顏色。
colors =np.array(['lightgreen', 'darkred','navy','brown','violet','plum',

'yellow','darkgreen'])

mplot3d

  • plot3d工具集是 matplotlib內置的標配,可用來實現3D數據可視化功能。若是生成的圖形在單獨的窗口中顯示,你還能夠用鼠標旋轉三維圖形的軸進行查看。

plot3d仍然使用 Figure對象,只不過Axes對象要替換爲該工具集的Axes3D對象。所以,使用Axes30對象前,需先將其導入進來。

from mpl_toolkits.mplot3d import Axes3D

3D曲面

  • 繪製等值線圖所用到的z=f(x,y)函數。計算出分割線座標後,就能夠用

plot_surface()函數繪製曲面。

fig = plt.figure()

ax = Axes3D(fig)

X = np.arange(-2,2,0.1)

Y = np.arange(-2,2,0.1)

X,Y = np.meshgrid(X,Y)

def f(x,y):

    return (1-y**5+x**5)*np.exp(-x**2-y**2)

ax.plot_surface(X,Y,f(X,Y),rstride=1,cstride=1)

plt.show()
  • 修改顏色表,3D表面效果會更加突出,例如,能夠用cmap關鍵字參數指定各顏色。還能夠用view_init()函數旋轉曲面,修改e1ev和azim兩個關鍵字參數,從不一樣的視角查看曲面,其中第一個關鍵字參數指定從哪一個高度查看曲面,第二個參數指定曲面旋轉的角度.
fig = plt.figure()

ax = Axes3D(fig)

X = np.arange(-2,2,0.1)

Y = np.arange(-2,2,0.1)

X,Y = np.meshgrid(X,Y)

def f(x,y):

    return (1-y**5+x**5)*np.exp(-x**2-y**2)

ax.plot_surface(X,Y,f(X,Y),rstride=1,cstride=1,cmap=plt.cm.hot)

ax.view_init(elev=30,azim=125)

plt.show()

3D散點圖

  • 經過這種可視化方法,可以識別數據點的分佈是否遵循某種特定趨勢,尤爲是能夠識別它們是否有彙集成簇的趨勢。

  • 下面這個例子中,咱們仍舊使用 scatter()函數,使用方法跟繪製2D圖形相同,可是要將其應用於AXes3D對象。這樣作,你能夠屢次調用scatter()函數,在同一個3D對象中顯示不一樣的序列。

xs = np.random.randint(30, 40,100)

ys = np.random.randint (20, 30, 100)

zs =np.random.randint(10,20,100)

xs2 =np. random.randint (50, 60, 100)

ys2 =np. random.randint(30,40,100)

zs2 = np. random.randint(50,70, 100)

xs3 =np.random.randint(10, 30, 100)

ys3 =np. random.randint(40, 50, 100)

zs3 =np. random.randint(40, 50, 100)

fig = plt.figure()

ax = Axes3D(fig)

ax.scatter(xs,ys,zs)

ax.scatter(xs2,ys2,zs2,c='r',marker='^')

ax.scatter(xs3,ys3,zs3,c='g',marker='*')

ax.set_xlabel('X Label')

ax.set_ylabel('Y Label')

ax.set_zlabel('Z Label')

plt.show()

3D條狀圖

  • 要繪製這種圖表,一樣是將bar()函數應用於AXes3D對象。若是定義了多個序列,能夠在同一個3D對象上屢次調用bar()函數。
x = np.arange(8)

y = np.random.randint(0,10,8)

y2 = y + np.random.randint(0,10,8)

y3 = y2 + np.random.randint(0,10,8)

y4 = y3 + np.random.randint(0,10,8)

y5 = y4 + np.random.randint(0,10,8)

clr = ['#4bb2c5',"#c5b47f","#EAAA28",

"#579575",'#839557',"#958c12", '#953579',"#4b5de4"]

fig = plt.figure()

ax = Axes3D(fig)

ax.bar(x,y,0,zdir='y',color=clr)

ax.bar(x,y2,10,zdir='y',color=clr)

ax.bar(x,y3,20,zdir='y',color=clr)

ax.bar(x,y4,30,zdir='y',color=clr)

ax.bar(x,y5,40,zdir='y',color=clr)

ax.set_xlabel('X Axis')

ax.set_ylabel('Y Axis')

ax.set_zlabel('Z Axis')

ax.view_init(elev=40)

plt.show()

多面板圖形

在其餘子圖中顯示子圖

  • 主Axes對象(也就是說主圖表)跟放置另外一個Aes對象實例的框架分開。用 figure()函數取到 Figure對象,用 add axes()函數在它上面定義兩個Axes對象。
fig = plt.figure()

ax = fig.add_axes([0.1,0.1,0.8,0.8])

inner_ax = fig.add_axes([0.6,0.6,0.25,0.25])

x1 = np.arange(10)

y1 = np.array([1,2,7,1,5,2,4,2,3,1])

x2 = np.arange(10)

y2 = np.array([1,3,4,5,4,5,2,6,4,3])

ax.plot(x1,y1)

inner_ax.plot(x2,y2)

plt.show()

子圖網絡

  • 要把圖形分紅多個區域,添加多個子圖,能夠用 subplots(函

數,方法也很簡單。 matplotlib的 Gridspec()函數可用來管理更爲複雜的狀況。它把繪圖區域分紅多個子區域,你能夠把一個或多個子區域分配給每一幅子圖。

gs = plt.GridSpec(3,3)

fig = plt.figure(figsize=(6,6))

fig.add_subplot(gs[1,:2])

fig.add_subplot(gs[0,:2])

fig.add_subplot(gs[2,0])

fig.add_subplot(gs[:2,2])

fig.add_subplot(gs[2,1:])

plt.show()
  • 能夠在 add subplot()函數返回的Axes對象上調用plot()函數,繪製相應的圖形。
gs = plt.GridSpec(3,3)

fig = plt.figure(figsize=(6,6))

x1 = np.array([1,3,2,5])

y1 = np.array([4,3,7,2])

x2 = np.arange(5)

y2 = np.array([3,2,4,6,4])

s1 = fig.add_subplot(gs[1,:2])

s1.plot(x1,y1,'r')

s2 = fig.add_subplot(gs[0,:2])

s2.bar(x2,y2)

s3 = fig.add_subplot(gs[2,0])

s3.barh(x2,y2,color='g')

s4 = fig.add_subplot(gs[:2,2])

s4.plot(x2,y2,'k')

s5 = fig.add_subplot(gs[2,1:])

s5.plot(x1,y1,'b',x2,y2,'yo')

plt.show()
相關文章
相關標籤/搜索