1. 程式人生 > >matplotlib 基礎教程

matplotlib 基礎教程

做資料分析,首先是要熟悉和理解資料,所以掌握一個趁手的視覺化工具是非常重要的,否則對資料連個基本的感性認識都沒有,如何進行下一步的design

 原文地址(非常棒):http://www.cnblogs.com/fxjwind/p/3923028.html

Getting Started with Matplotlib

先看個簡單的例子,plot,即畫線

畫線,需要給出線上的點的座標,然後Matplotlib會自動將點連成線

In [2]: x = range(6) 
In [3]: plt.plot(x, [xi**2 for xi in x])

image

可以看到plot的引數是兩個list,分佈表示x軸和y軸的座標點的list

可以看到這裡的線不是很平滑,是因為range的產生的點粒度比較粗,並且使用list comprehension來產生y值

所以這裡儘量使用Numpy的arange(x, y, z)函式

好處是粒度可以更小,而且關鍵是返回的是Numpy的Array,可以直接進行向量或矩陣運算,如下

In [3]: x = np.arange(1, 5) 
In [4]: plt.plot(x, x*1.5, x, x*3.0, x, x/3.0)

image

可以用plot畫多條線

Grid, axes, and labels

開啟網格

In [5]: plt.grid(True)

image

預設會自動產生X和Y軸上的取值範圍,比如上面的圖,

In [5]: plt.axis() # shows the current axis limits values 
Out[5]: (1.0, 4.0, 0.0, 12.0) 
分別表示,[xmin, xmax, ymin, ymax],所以看上圖x軸是從1到4,y軸是從0到12

改變取值範圍, 
In [6]: plt.axis([0, 5, -1, 13]) # set new axes limits

image

還能給x和y軸加上lable說明,

In [2]: plt.plot([1, 3, 2, 4]) 
In [3]: plt.xlabel('This is the X axis') 
In [4]: plt.ylabel('This is the Y axis')

image

Titles and legends

給整個圖加上title

In [2]: plt.plot([1, 3, 2, 4]) 
In [3]: plt.title('Simple plot')

image

還可以給每條線增加圖示,legend

In [3]: x = np.arange(1, 5) 
In [4]: plt.plot(x, x*1.5, label='Normal') 
In [5]: plt.plot(x, x*3.0, label='Fast') 
In [6]: plt.plot(x, x/3.0, label='Slow') 
In [7]: plt.legend()

image

指定每條線的label,然後呼叫legend()會自動顯示圖示

可以看到這個圖示的位置不是很好,擋住圖,可以通過引數指定位置

legend(loc='upper left')

loc可以選取的值,其中best,是自動找到最好的位置

imageimage

Saving plots to a file

最簡單,使用預設設定 
plt.savefig('plot123.png')

其中兩個設定可以決定圖片大小,figure size and the DPI

In [1]: import matplotlib as mpl 
In [2]: mpl.rcParams['figure.figsize'] 
Out[2]: [8.0, 6.0] 
In [3]: mpl.rcParams['savefig.dpi'] 
Out[3]: 100

an 8x6 inches figure with 100 DPI results in an 800x600 pixels image,這就是預設值

In [4]: plt.savefig('plot123_2.png', dpi=200)

這樣圖的解析度,變為1600×1200

Decorate Graphs with Plot Styles

Markers and line styles

上面畫的線都是一樣的,其實我們可以畫出各種不同的線 
Marker就是指形成線的那些點

plot() supports an optional third argument that contains a format string for each pair of X, Y arguments in the form of:
plt.plot(X, Y, '<format>', ...)

plot通過第三個string引數可以用來指定,Colors,Line styles,Marker styles

線的顏色,

image

線的style,

image

Marker的style

image 

imageimage

可以用string format單獨或混合的表示所有的style,

In [3]: y = np.arange(1, 3, 0.3) 
In [4]: plt.plot(y, 'cx--', y+1, 'mo:', y+2, 'kp-.');

image

比如第一條線,c表示cyan青色,x表示marker style為x,--表示line style

一般用string format已經足夠,但也可以用具體的keyword引數進行更多的個性化

image

Handling X and Y ticks

前面X和Y軸上的ticks是自動生成的,這個也是可以通過xticks和yticks函式個性化定製的

The arguments (in the form of lists) that we can pass to the function are: 
• Locations of the ticks 
• Labels to draw at these locations (if necessary)

可以定義,每個tick的location和相應的label(可選,不指定預設顯示location)

In [2]: x = [5, 3, 7, 2, 4, 1] 
In [3]: plt.plot(x); 
In [4]: plt.xticks(range(len(x)), ['a', 'b', 'c', 'd', 'e', 'f']); 
In [5]: plt.yticks(range(1, 8, 2));

image

對x軸同時指定location和label 
對y軸只是指定location

Plot types

上面介紹了很多,都是以plot作為例子,matplotlib還提供了很多其他型別的圖 
作者這張圖很贊,描述所有圖的用法

image

Histogram charts

直方圖是用來離散的統計資料分佈的,會把整個資料集,根據取值範圍,分成若干類,稱為bins 
然後統計中每個bin中的資料個數

In [3]: y = np.random.randn(1000) 
In [4]: plt.hist(y); 
In [5]: plt.show()

image

hist預設是分為10類,即bins=10, 上圖就是把取值[-4,4]上的1000個隨機數,分成10個bins,統計每個的資料個數 
可以看出這個隨機函式是典型的正態分佈

我們可以改變bins的值, 
In [6]: plt.hist(y, 25);

image

如圖是,分成25個bins

Error bar charts

In [3]: x = np.arange(0, 4, 0.2) 
In [4]: y = np.exp(-x) 
In [5]: e1 = 0.1 * np.abs(np.random.randn(len(y))) 
In [8]: e2 = 0.1 * np.abs(np.random.randn(len(y))) 
In [9]: plt.errorbar(x, y, yerr=e1, xerr=e2, fmt='.-', capsize=0);

image

畫出每個點的同時,畫出每個點上的誤差範圍

還能畫出非對稱的誤差, 
In [11]: plt.errorbar(x, y, yerr=[e1, e2], fmt='.-');

image

Bar charts

plt.bar([1, 2, 3], [3, 2, 5]);

image

對於bar,需要設定3個引數 
左起始座標,高度,寬度(可選,預設0.8) 
所以上面的例子,指定起始點和高度引數

好,看個複雜的例子,bar圖一般用於比較多個數據值

In [3]: data1 = 10*np.random.rand(5) 
In [4]: data2 = 10*np.random.rand(5) 
In [5]: data3 = 10*np.random.rand(5) 
In [6]: e2 = 0.5 * np.abs(np.random.randn(len(data2))) 
In [7]: locs = np.arange(1, len(data1)+1) 
In [8]: width = 0.27 
In [9]: plt.bar(locs, data1, width=width); 
In [10]: plt.bar(locs+width, data2, yerr=e2, width=width, color='red'); 
In [11]: plt.bar(locs+2*width, data3, width=width, color='green') ; 
In [12]: plt.xticks(locs + width*1.5, locs);

image

需要學習的是,如何指定多個bar的起始位置,後一個bar的loc = 前一個bar的loc + width 
如何設定ticks的label,讓它在一組bars的中間位置,locs + width*1.5

Pie charts

餅圖很好理解,表示成分

In [2]: plt.figure(figsize=(3,3)); 
In [3]: x = [45, 35, 20] 
In [4]: labels = ['Cats', 'Dogs', 'Fishes'] 
In [5]: plt.pie(x, labels=labels);

image

來個複雜的, 
增加explode,即突出某些wedges,可以設定explode來增加offset the wedge from the center of the pie, 即radius fraction
0表示不分離,越大表示離pie center越遠,需要顯式指定每個wedges的explode

增加autopct,即在wedges上顯示出具體的比例

In [2]: plt.figure(figsize=(3,3)); 
In [3]: x = [4, 9, 21, 55, 30, 18] 
In [4]: labels = ['Swiss', 'Austria', 'Spain', 'Italy', 'France', 'Benelux'] 
In [5]: explode = [0.2, 0.1, 0, 0, 0.1, 0] 
In [6]: plt.pie(x, labels=labels, explode=explode, autopct='%1.1f%%');

image

Scatter plots

只畫點,不連線,用來描述兩個變數之間的關係,比如在進行資料擬合之前,看看變數間是線性還是非線性

In [3]: x = np.random.randn(1000) 
In [4]: y = np.random.randn(1000) 
In [5]: plt.scatter(x, y);

image

通過s來指定size,c來指定color, 
marker來指定點的形狀

image

In [7]: size = 50*np.random.randn(1000) 
In [8]: colors = np.random.rand(1000) 
In [9]: plt.scatter(x, y, s=size, c=colors);

image

Text inside figure, annotations, and arrows

用於添加註解,

增加text很簡單,座標x,y,內容

plt.text(x, y, text)

例子,

In [3]: x = np.arange(0, 2*np.pi, .01) 
In [4]: y = np.sin(x) 
In [5]: plt.plot(x, y); 
In [6]: plt.text(0.1, -0.04, 'sin(0)=0');

image

annotate,便於增加註釋

引數, 
xy,需要添加註釋的座標 
xytext,註釋本身的座標 
arrowprops,箭頭的型別和屬性

In [2]: y = [13, 11, 13, 12, 13, 10, 30, 12, 11, 13, 12, 12, 12, 11,12] 
In [3]: plt.plot(y); 
In [4]: plt.ylim(ymax=35); 增大y的空間,否則註釋放不下 
In [5]: plt.annotate('this spot must really\nmean something', 
xy=(6, 30), xytext=(8, 31.5), arrowprops=dict(facecolor='black', shrink=0.05));

image

明顯這個箭頭比較醜,箭頭可以有很多種

In [2]: plt.axis([0, 10, 0, 20]); 
In [3]: arrstyles = ['-', '->', '-[', '<-', '<->', 'fancy', 'simple','wedge'] 
In [4]: for i, style in enumerate(arrstyles): 
              plt.annotate(style, xytext=(1, 2+2*i), xy=(4, 1+2*i), arrowprops=dict(arrowstyle=style));


In [5]: connstyles=["arc", "arc,angleA=10,armA=30,rad=15", "arc3,rad=.2", "arc3,rad=-.2", "angle", "angle3"]
In [6]: for i, style in enumerate(connstyles): 
              plt.annotate("", xytext=(6, 2+2*i), xy=(8, 1+2*i), arrowprops=dict(arrowstyle='->', connectionstyle=style));

image

Subplots

上面matplotlib,預設會幫我們建立figure和subplot

fig = plt.figure() 
ax = fig.add_subplot(111)

其實我們可以顯式的建立,這樣的好處是我們可以在一個figure中畫多個subplot

其中subplot的引數,

fig.add_subplot(numrows, numcols, fignum) 
- numrows represents the number of rows of subplots to prepare 
- numcols represents the number of columns of subplots to prepare 
- fignum varies from 1 to numrows*numcols and specifies the current subplot (the one used now)

我們會產生numrows×numcols個subplot,fignum表示編號

In [2]: fig = plt.figure() 
In [3]: ax1 = fig.add_subplot(211) 
In [4]: ax1.plot([1, 2, 3], [1, 2, 3]); 
In [5]: ax2 = fig.add_subplot(212) 
In [6]: ax2.plot([1, 2, 3], [3, 2, 1]);

image

Plotting dates

日期比較長,直接畫在座標軸上,沒法看

具體看下如何畫?

產生x軸資料,利用mpl.dates.drange產生x軸座標

import matplotlib as mpl 
In [7]: date2_1 = dt.datetime(2008, 9, 23) 
In [8]: date2_2 = dt.datetime(2008, 10, 3) 
In [9]: delta2 = dt.timedelta(days=1) 
In [10]: dates2 = mpl.dates.drange(date2_1, date2_2, delta2)

隨機產生y軸座標,畫出polt圖

In [11]: y2 = np.random.rand(len(dates2)) 
In [12]: ax2.plot_date(dates2, y2, linestyle='-');

關鍵步驟來了,我們要設定xaxis的locator和formatter來顯示時間 
首先設定formatter,

In [13]: dateFmt = mpl.dates.DateFormatter('%Y-%m-%d') 
In [14]: ax2.xaxis.set_major_formatter(dateFmt)

再設定locator,

In [15]: daysLoc = mpl.dates.DayLocator() 
In [16]: hoursLoc = mpl.dates.HourLocator(interval=6) 
In [17]: ax2.xaxis.set_major_locator(daysLoc) 
In [18]: ax2.xaxis.set_minor_locator(hoursLoc)

注意這裡major和minor,major就是大的tick,minor是比較小的tick(預設是null) 
比如date是大的tick,但是想看的細點,所以再設個hour的tick,但是畫24個太多了,所以interval=6,只畫4個 
而formatter只是設定major的,所以minor的是沒有label的

image

再看個例子,

產生x軸座標,y軸座標,畫出plot

In [22]: date1_1 = dt.datetime(2008, 9, 23) 
In [23]: date1_2 = dt.datetime(2009, 2, 16) 
In [24]: delta1 = dt.timedelta(days=10) 
In [25]: dates1 = mpl.dates.drange(date1_1, date1_2, delta1) 
In [26]: y1 = np.random.rand(len(dates1)) 
In [27]: ax1.plot_date(dates1, y1, linestyle='-');

設定locator 
major的是Month,minor的是week

In [28]: monthsLoc = mpl.dates.MonthLocator() 
In [29]: weeksLoc = mpl.dates.WeekdayLocator() 
In [30]: ax1.xaxis.set_major_locator(monthsLoc) 
In [31]: ax1.xaxis.set_minor_locator(weeksLoc)

設定Formatter

In [32]: monthsFmt = mpl.dates.DateFormatter('%b') 
In [33]: ax1.xaxis.set_major_formatter(monthsFmt)

image

Using LaTeX formatting

這個略diao

the start and the end of a mathtext string is $ 
Python raw string需要r‘’,表示不轉義

直接看例子,

In [6]: ax.text(2, 8, r"ματπλωτλιβ ");
In [7]: ax.text(2, 6, r"lim x0 1x ");
In [8]: ax.text(2, 4, r"abcac ");
In [9]: ax.text(2, 2, r"  i=1 x 2 i  ");
In [10]: ax.text(4, 8, r"sin(0)=cos(π2) ");
In [11]: ax.text(4, 6, r"x  3 =y   ");
In [12]: ax.text(4, 4, r"¬(ab)¬a¬b ");
In [13]: ax.text(4, 2, r" b a f(x)dx ");

image

相關推薦

matplotlib 基礎教程

做資料分析,首先是要熟悉和理解資料,所以掌握一個趁手的視覺化工具是非常重要的,否則對資料連個基本的感性認識都沒有,如何進行下一步的design  原文地址(非常棒):http://www.cnblogs.com/fxjwind/p/3923028.html Getting Started with

Python-matplotlib-入門教程(一)-基礎圖表繪製

0.摘要 本教程主要介紹使用python第三方庫matplotlib繪製各種統計圖表,教程從簡單到複雜,逐步遞進。 本章主要介紹常見圖表的繪製方法,並以儘可能簡單的方式實現,主要以突出函式功能為目的,防止讀者被複雜的引數分散了注意力。鑑於函式的引數的相似性,讀者只需要知道引數的含義並結合he

【備忘】2017年最新北風網零基礎學習機器學習(Python語言、演算法、Numpy庫、MatplotLib)視訊教程

機器學習作為人工智慧的一部分,已經應用於很多領域,遠超過人們的想象,垃圾郵件的過濾,線上廣告的推薦系統,還有目前發展飛快的物體識別、人臉識別和語音識別的發展,都是機器學習的應用的成果。機器學習在改善商業決策、提高生產率、檢測疾病、預測天氣等方面都有非常大的應用前景。1. 課

最完整的Elasticsearch 基礎教程

epo -o 小寫 名稱 搜索結果 博客 需要 必須 搜索api 基礎概念 Elasticsearch有幾個核心概念。從一開始理解這些概念會對整個學習過程有莫大的幫助。 接近實時(NRT) Elasticsearch是一個接近實時的搜索平臺。這意

【solr基礎教程之中的一個】Solr相關知識點串講

struct 詞匯 ont types 映射 details 必備 功能 提交 Solr是Apache Lucene的一個子項目。Lucene為全文搜索功能提供了完備的API。但它僅僅作為一個API庫存在。而不能直接用於搜索。因此,Solr基

Thrift 基礎教程(一)安裝篇

div 更新 g++ pat 定義 init 環境 1.7 進行 1、Thrift簡單介紹 Thrift是一款由Fackbook開發的可伸縮、跨語言的服務開發框架,該框架已經開源而且增加的Apache項目。Thrift主要功能是:通過自己定義的Interface Def

&lt;&lt;Python基礎教程&gt;&gt;學習筆記 | 第12章 | 圖形用戶界面

lena text 平臺 post ack 由於 contents exp 一個 Python支持的工具包非常多。但沒有一個被覺得標準的工具包。用戶選擇的自由度大些.本章主要介紹最成熟的跨平臺工具包wxPython.官方文檔: http://wxpython.org/

Python基礎教程之第5章 條件, 循環和其它語句

like eba cti python基礎 word 沒有 positive while循環 pytho Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32

SiteMesh基礎教程

導航條 web頁面 att blank symphony 創建 筆記 整合 web SiteMesh是由一個基於Web頁面布局、裝飾以及與現存Web應用整合的框架。它能幫助我們在由大量頁面構成的項目中創建一致的頁面布局和外觀,如一致的導航條,一致的banner,一致的版權,

ATOM基礎教程一使用前端插件emmet(16)

自減 styles 工程 expand string 元素符號 asc value adding emmet簡介 http://blog.csdn.net/zsl10/article/details/51956791 emmet的前身是Zen coding,從事Web前

Solr基礎教程之solrconfig.xml(三)

配置文件 multi listener 了無 files content esc lte 存儲 前面介紹過schema.xml的一些配置信息,本章介紹solrconfig.xml的配置,以及怎樣安裝smartcn分詞器和IK分詞器,並介紹主要的查詢語法。

Nginx基礎教程

ref doc lena root mic htm cati 路徑 filename 極速教程 原文鏈接 1.靜態服務器 server { listen 80; # 端口號 location / { root /usr/share/ngin

Tinyshop前後臺操作基礎教程講解

類型 ext https part 商品管理 數據庫管理 tle 商品 品牌 Tinyshop前後臺操作基礎教程講解 01 tinyshop v3框架的安裝 【錄播】tinyshop v3框架的安裝(8分鐘) 02 tinyshop v3框架的後臺基本參數

[學習筆記—Objective-C]《Objective-C-基礎教程 第2版》第十一章 屬性

變量名 erl .text nonatomic syn split view 不能 -name 11.1 使用屬性值 @property float rainHandling; //表明此類具有float類型的屬性,其名稱為rainHandling

【Nutch基礎教程之七】Nutch的2種執行模式:local及deploy

mapred nap ont nal servlet miss mos ant issue 在對nutch源碼執行ant runtime後,會創建一個runtime的文件夾。在runtime文件夾下有deploy和local 2個文件夾。 [[email 

數據分析基礎教程Numpy指南筆記

rgs sign font 功能 hang ptime indices import ges Numpy指南筆記 第2章:Numpy基礎 創建多維數組# coding:utf-8import numpy as npm=np.array([np.arange(2),np.ar

【Unity3D基礎教程】給初學者看的Unity教程(零):如何學習Unity3D

cos 詳解 component lock index unity3d遊戲 design 技術棧 log 【Unity3D基礎教程】給初學者看的Unity教程(零):如何學習Unity3D http://www.cnblogs.com/neverdie/p/How_To_

ucos-III基礎教程匯總

html -s ont 基礎教程 ucos-ii htm itl .html post 目錄:  1.ucos-III前言 ucos-III基礎教程匯總

linux基礎教程---設置文件的主人、組別

post 基礎 -s dsm track pos data- chmod pre 我們在操作linux的是要告訴文件是屬於哪個主人的,哪個組別的。這樣我們就須要知道該怎樣設置“: 設置文件的主人、組別 chown: change owner >cho

linux基礎教程---內容操作

article linu 單位 src 輸出內容 lin ont name con 一、尋找文件裏的指定內容 尋找文件裏的指定內容,輸出內容所在行的所有信息 grep 被搜索內容 文件路徑名 >grep var