Matplotlib簡單教程
繪圖簡介
使用matplotlib庫繪圖,原理很簡單,就是下面這5步:
- 創(chuàng)建一個圖紙 (figure)
- 在圖紙上創(chuàng)建一個或多個繪圖(plotting)區(qū)域(也叫子圖,坐標系/軸,axes)
- 在plotting區(qū)域上描繪點、線等各種marker
- 為plotting添加修飾標簽(繪圖線上的或坐標軸上的)
- 其他各種DIY
上述的過程主要分為3個方面:
- 變量
- 函數(shù)
- 圖紙(figure)和子圖(axes)
- 其中,變量和函數(shù)通過改變figure和axes中的元素(例如:title,label,點和線等等)一起描述figure和axes,也就是在畫布上繪圖。結構如下:

plot繪制繪制坐標
plt.plot(x, y, format_string, **kwargs)
說明:
- x, y:分別是x,y軸的數(shù)據(jù),可以是列表,參數(shù)x是可選的,而y是必要的
- fromat_string:控制曲線格式的字符串,可選
- **kwargs:第二組或更多的(x, y, format_string)
首先繪制一張簡單的圖
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.xlabel('some x numbers')
plt.ylabel('some y numbers')
plt.title('a straight line')
plt.show()
繪圖的結果如下圖所示:

解釋:
可見,繪制一個簡單的圖,只需要原理中的第3,4步就行了。
主要看第3行的代碼,plt.plot()函數(shù)可以接受很多參數(shù),第一、二個是x, y軸的坐標,之后還會有繪圖線的顏色和類型。函數(shù)中我們只給出了一個列表,所以matplotlib默認給出的是y,然后自動生成x。
下面我們傳入多個列表,并且添加描繪線的類型和顏色的部分
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(10)
plt.plot(a, a*1.5, 'go-', label='Firstline')
plt.plot(a, a*2.5, 'rx', label="Secondline")
plt.plot(a, a*3.5, '*', label="Thirdline")
plt.plot(a, a*4.5, 'b-.', label="Fourthline")
plt.title('using_format_string')
plt.xlabel('some x numbers')
plt.ylabel('some y numbers')
plt.legend()
plt.show()
結果如下:

上面的程序中,我們在每一組數(shù)據(jù)的后面加上了控制曲線格式字符串,由顏色、字符風格和標記字符組成。
支持的color:
| character | color | character | color |
|---|---|---|---|
| 'b' | blue | 'm' | magenta |
| 'g' | green | 'y' | yellow |
| 'r' | red | 'k' | black |
| 'c' | cyan | 'w' | white |
| '#xxxxxx' | RGB | '0.8' | gray level |
支持的line style:
| 標記字符 | 說明 | 標記字符 | 說明 |
|---|---|---|---|
| '.' | 點 | 'D' | 菱形 |
| ',' | 像素(極小點) | 'd' | 瘦菱形 |
| 'o' | 實心圈 | '|' | 豎直線 |
| 'v' | 倒三角 | '1' | 下花三角 |
| '^' | 上三角 | '2' | 上花三角 |
| '>' | 右三角 | '3' | 左花三角 |
| '<' | 左三角 | '4' | 右花三角 |
| 'h' | 豎六邊形 | 's' | 實心方形 |
| 'H' | 橫六邊形 | 'p' | 實心五角 |
| '+' | 十字 | '*' | 星型 |
| 'x' | x標記 |
| 風格字符 | 說明 |
|---|---|
| '-' | 實線 |
| '--' | 波折線 |
| '-.' | 點折線 |
| ':' | 虛線 |
| ‘’ | 無線條 |
上述程序中我們?yōu)槊恳粭l線指定了一個label,并且用plt.legend()指定生成圖例。
另外,我們不僅可以用字符串一次性指定多個屬性,也可以分別為每個屬性賦值。
- color:控制顏色,color=’green’
- linestyle:線條風格,linestyle=’dashed’
- marker:標記風格,marker = ‘o’
- markerfacecolor:標記顏色,markerfacecolor = ‘blue’
- markersize:標記尺寸,markersize = ‘20’
- linewidth:線寬:linewidth=2.0
例如:
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(10)
plt.plot(a, a**2, color='green', linestyle='dashed', marker='o', markerfacecolor='blue', markersize='10',linewith=2.0)
plt.title('using_format_string')
plt.xlabel('some x numbers')
plt.ylabel('some y numbers')
plt.legend()
plt.show()
結果如下:

多圖多axes
MATLAB和plt1都有當前figure和axes的概念
也就是說,通過plt 進行的操作都是對當前圖或子圖進行的,所有的繪圖命令都是針對當前figure和axes的.如果figure()和subplot()沒有定義的話,都默認為figure(1)和subplot(111)。
plt.figure(i):表示當前對第幾塊畫布進行操作
plt.subplot(nrows, ncols, plot_number):把一個繪圖區(qū)域(可以理解成畫布)分成多個小區(qū)域,用來繪制多個子圖。
nrows和ncols表示將畫布分成(nrows*ncols)個小區(qū)域,每個小區(qū)域可以單獨繪制圖形;plot_number表示將圖繪制在第plot_number個子區(qū)域。
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(10)
plt.figure(1)
plt.subplot(221)
plt.plot(a, a, 'ro-')
plt.subplot(222)
plt.plot(a, a**2, 'go-')
plt.subplot(223)
plt.plot(a, a**3, 'bo-')
plt.subplot(224)
plt.plot(a, a**2, 'yo-')
plt.legend()
plt.show()
運行結果:

條形圖和直方圖
有了plt.plot()的基礎之后,對后面的直方圖和餅狀圖的理解就很容易了。
直接上例子:
import matplotlib.pyplot as plt
plt.bar([1, 3, 5, 7, 9], [5, 2, 7, 8, 2], label="Example one")
plt.bar([2, 4, 6, 8, 10], [8, 6, 2, 5, 6], label="Example two", color='g')
plt.legend()
plt.xlabel('bar number')
plt.ylabel('bar height')
plt.title('Epic Graph\nAnother Line!')
plt.show()
運行結果如下:

plt..bar()中參數(shù)的總結,轉:http://blog.csdn.net/claroja/article/details/72912791?utm_source=itdadao&utm_medium=referral
接下來我們嘗試添加一些屬性信息:
from matplotlib import pyplot as plt
import numpy as np
# 第一步,取出一張白紙
fig = plt.figure(1)
# 第二步,確定繪圖范圍,由于只需要畫一張圖,所以我們將整張白紙作為繪圖的范圍
ax1 = plt.subplot(111)
# 第三步,整理我們準備繪制的數(shù)據(jù)
data = np.array([15, 20, 18, 25])
# 第四步,準備繪制條形圖,思考繪制條形圖需要確定那些要素
# 1、繪制的條形寬度
# 2、繪制的條形位置(中心)
# 3、條形圖的高度(數(shù)據(jù)值)
width = 0.5
x_bar = np.arange(4)
# 第五步,繪制條形圖的主體,條形圖實質上就是一系列的矩形元素,我們通過plt.bar函數(shù)來繪制條形圖
rect = ax1.bar(left=x_bar, height=data, width=width, color="lightblue", alpha=0.8, align='center')
# 第六步,向各條形上添加數(shù)據(jù)標簽
for rec in rect:
x = rec.get_x()
height = rec.get_height()
ax1.text(x+0.1,1.02*height,str(height))
# 第七步,繪制x,y坐標軸刻度及標簽,標題
xtickLabels = ('first', 'second', 'third', 'fourth')
ax1.set_xticks(x_bar)
ax1.set_xticklabels(("first", "second", "third", "fourth"), fontsize='large', rotation=30, alpha=0.8)
ax1.set_ylabel("sales")
ax1.set_title("The Sales in 2016")
ax1.grid(True)
ax1.set_ylim(0, 28)
plt.show()
運行結果如下:

接下來講解直方圖:
接下來,我們會講解直方圖。 直方圖非常像條形圖,傾向于通過將區(qū)段組合在一起來顯示分布。 可能是年齡的分組,或測試的分數(shù)。 我們并不是顯示每一組的數(shù)據(jù),而是按照 20 ~ 25,25 ~ 30… 等等來顯示數(shù)據(jù)。 這里有一個例子:
population_ages = [22, 55, 62, 45, 21, 22, 34, 42, 42, 4, 99, 102, 110, 120, 121, 122, 130, 111, 115, 112, 80, 75, 65,
54, 44, 43, 42, 48]
bins = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130]
plt.hist(population_ages, bins, histtype='bar', rwidth=0.8)
plt.xlabel('x', fontsize='large')
plt.ylabel('y', rotation=0, fontsize='large')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()
運行結果如下:

散點圖
示例代碼:
import matplotlib.pyplot as plt
x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]
plt.scatter(x,y, label='skitscat', color='k', s=25, marker="o")
plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()
運行結果如下:

餅狀圖
通常,餅圖用于顯示部分對于整體的情況,通常以%為單位。 幸運的是,Matplotlib 會處理切片大小以及一切事情,我們只需要提供數(shù)值。
示例程序:
import matplotlib.pyplot as plt
slices = [7,2,2,13]
activities = ['sleeping','eating','working','playing']
cols = ['c','m','r','b']
plt.pie(slices,
labels=activities,
colors=cols,
startangle=90,
shadow= True,
explode=(0,0.1,0,0),
autopct='%1.1f%%')
plt.title('Interesting Graph\nCheck it out')
plt.show()
運行結果:

在plt.pie中,我們需要指定『切片』,這是每個部分的相對大小。 然后,我們指定相應切片的顏色列表。 接下來,我們可以選擇指定圖形的『起始角度』。 這使你可以在任何地方開始繪圖。 在我們的例子中,我們?yōu)轱瀳D選擇了 90 度角,這意味著第一個部分是一個豎直線條。 接下來,我們可以選擇給繪圖添加一個字符大小的陰影,然后我們甚至可以使用explode拉出一個切片。
我們總共有四個切片,所以對于explode,如果我們不想拉出任何切片,我們傳入0,0,0,0。 如果我們想要拉出第一個切片,我們傳入0.1,0,0,0。
最后,我們使用autopct,選擇將百分比放置到圖表上面。
堆疊圖
堆疊圖用于顯示『部分對整體』隨時間的關系。 堆疊圖基本上類似于餅圖,只是隨時間而變化。
讓我們考慮一個情況,我們一天有 24 小時,我們想看看我們如何花費時間。 我們將我們的活動分為:睡覺,吃飯,工作和玩耍。
我們假設我們要在 5 天的時間內跟蹤它,因此我們的初始數(shù)據(jù)將如下所示:
import matplotlib.pyplot as plt
days = [1, 2, 3, 4, 5]
sleeping = [7, 8, 6, 11, 7]
eating = [2, 3, 4, 3, 2]
working = [7, 8, 7, 2, 2]
playing = [8, 5, 7, 8, 13]
因此,我們的x軸將包括day變量,即 1, 2, 3, 4 和 5。然后,日期的各個成分保存在它們各自的活動中。 像這樣繪制它們:
plt.stackplot(days, sleeping, eating, working, playing, colors=['m', 'c', 'r', 'k'])
plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.show()
運行結果如下:

在這里,我們可以至少在顏色上看到,我們如何花費我們的時間。 問題是,如果不回頭看代碼,我們不知道什么顏色是什么。 下一個問題是,對于多邊形來說,我們實際上不能為數(shù)據(jù)添加『標簽』。 因此,在任何不止是線條,帶有像這樣的填充或堆疊圖的地方,我們不能以固有方式標記出特定的部分。 這不應該阻止程序員。 我們可以解決這個問題:
import matplotlib.pyplot as plt
days = [1, 2, 3, 4, 5]
sleeping = [7, 8, 6, 11, 7]
eating = [2, 3, 4, 3, 2]
working = [7, 8, 7, 2, 2]
playing = [8, 5, 7, 8, 13]
plt.plot([], [], color='m', label='Sleeping', linewidth=5)
plt.plot([], [], color='c', label='Eating', linewidth=5)
plt.plot([], [], color='r', label='Working', linewidth=5)
plt.plot([], [], color='k', label='Playing', linewidth=5)
plt.stackplot(days, sleeping, eating, working, playing, colors=['m', 'c', 'r', 'k'])
plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()
運行結果如下:
