Matplotlib簡(jiǎn)單教程
繪圖簡(jiǎn)介
使用matplotlib庫(kù)繪圖时肿,原理很簡(jiǎn)單截珍,就是下面這5步:
- 創(chuàng)建一個(gè)圖紙 (figure)
- 在圖紙上創(chuàng)建一個(gè)或多個(gè)繪圖(plotting)區(qū)域(也叫子圖区匣,坐標(biāo)系/軸束铭,axes)
- 在plotting區(qū)域上描繪點(diǎn)丽已、線等各種marker
- 為plotting添加修飾標(biāo)簽(繪圖線上的或坐標(biāo)軸上的)
- 其他各種DIY
上述的過(guò)程主要分為3個(gè)方面:
- 變量
- 函數(shù)
- 圖紙(figure)和子圖(axes)
- 其中蚌堵,變量和函數(shù)通過(guò)改變figure和axes中的元素(例如:title,label,點(diǎn)和線等等)一起描述figure和axes,也就是在畫(huà)布上繪圖沛婴。結(jié)構(gòu)如下:
plot繪制繪制坐標(biāo)
plt.plot(x, y, format_string, **kwargs)
說(shuō)明:
- x, y:分別是x吼畏,y軸的數(shù)據(jù),可以是列表嘁灯,參數(shù)x是可選的泻蚊,而y是必要的
- fromat_string:控制曲線格式的字符串,可選
- **kwargs:第二組或更多的(x, y, format_string)
首先繪制一張簡(jiǎn)單的圖
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()
繪圖的結(jié)果如下圖所示:
解釋:
可見(jiàn)丑婿,繪制一個(gè)簡(jiǎn)單的圖性雄,只需要原理中的第3,4步就行了枯冈。
主要看第3行的代碼毅贮,plt.plot()函數(shù)可以接受很多參數(shù),第一尘奏、二個(gè)是x, y軸的坐標(biāo)滩褥,之后還會(huì)有繪圖線的顏色和類(lèi)型。函數(shù)中我們只給出了一個(gè)列表炫加,所以matplotlib默認(rèn)給出的是y瑰煎,然后自動(dòng)生成x。
下面我們傳入多個(gè)列表俗孝,并且添加描繪線的類(lèi)型和顏色的部分
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()
結(jié)果如下:
上面的程序中酒甸,我們?cè)诿恳唤M數(shù)據(jù)的后面加上了控制曲線格式字符串,由顏色赋铝、字符風(fēng)格和標(biāo)記字符組成插勤。
支持的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:
標(biāo)記字符 | 說(shuō)明 | 標(biāo)記字符 | 說(shuō)明 |
---|---|---|---|
'.' | 點(diǎn) | 'D' | 菱形 |
',' | 像素(極小點(diǎn)) | 'd' | 瘦菱形 |
'o' | 實(shí)心圈 | '|' | 豎直線 |
'v' | 倒三角 | '1' | 下花三角 |
'^' | 上三角 | '2' | 上花三角 |
'>' | 右三角 | '3' | 左花三角 |
'<' | 左三角 | '4' | 右花三角 |
'h' | 豎六邊形 | 's' | 實(shí)心方形 |
'H' | 橫六邊形 | 'p' | 實(shí)心五角 |
'+' | 十字 | '*' | 星型 |
'x' | x標(biāo)記 |
風(fēng)格字符 | 說(shuō)明 |
---|---|
'-' | 實(shí)線 |
'--' | 波折線 |
'-.' | 點(diǎn)折線 |
':' | 虛線 |
‘’ | 無(wú)線條 |
上述程序中我們?yōu)槊恳粭l線指定了一個(gè)label,并且用plt.legend()指定生成圖例革骨。
另外农尖,我們不僅可以用字符串一次性指定多個(gè)屬性,也可以分別為每個(gè)屬性賦值良哲。
- color:控制顏色盛卡,color=’green’
- linestyle:線條風(fēng)格,linestyle=’dashed’
- marker:標(biāo)記風(fēng)格筑凫,marker = ‘o’
- markerfacecolor:標(biāo)記顏色滑沧,markerfacecolor = ‘blue’
- markersize:標(biāo)記尺寸并村,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()
結(jié)果如下:
多圖多axes
MATLAB和plt1都有當(dāng)前figure和axes的概念
也就是說(shuō)滓技,通過(guò)plt 進(jìn)行的操作都是對(duì)當(dāng)前圖或子圖進(jìn)行的,所有的繪圖命令都是針對(duì)當(dāng)前figure和axes的.如果figure()和subplot()沒(méi)有定義的話哩牍,都默認(rèn)為figure(1)和subplot(111)。
plt.figure(i):表示當(dāng)前對(duì)第幾塊畫(huà)布進(jìn)行操作
plt.subplot(nrows, ncols, plot_number):把一個(gè)繪圖區(qū)域(可以理解成畫(huà)布)分成多個(gè)小區(qū)域殖属,用來(lái)繪制多個(gè)子圖姐叁。
nrows和ncols表示將畫(huà)布分成(nrows*ncols)個(gè)小區(qū)域,每個(gè)小區(qū)域可以單獨(dú)繪制圖形洗显;plot_number表示將圖繪制在第plot_number個(gè)子區(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()
運(yùn)行結(jié)果:
條形圖和直方圖
有了plt.plot()的基礎(chǔ)之后,對(duì)后面的直方圖和餅狀圖的理解就很容易了挠唆。
直接上例子:
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()
運(yùn)行結(jié)果如下:
plt..bar()中參數(shù)的總結(jié)处窥,轉(zhuǎn):http://blog.csdn.net/claroja/article/details/72912791?utm_source=itdadao&utm_medium=referral
接下來(lái)我們嘗試添加一些屬性信息:
from matplotlib import pyplot as plt
import numpy as np
# 第一步,取出一張白紙
fig = plt.figure(1)
# 第二步玄组,確定繪圖范圍滔驾,由于只需要畫(huà)一張圖,所以我們將整張白紙作為繪圖的范圍
ax1 = plt.subplot(111)
# 第三步俄讹,整理我們準(zhǔn)備繪制的數(shù)據(jù)
data = np.array([15, 20, 18, 25])
# 第四步哆致,準(zhǔn)備繪制條形圖,思考繪制條形圖需要確定那些要素
# 1患膛、繪制的條形寬度
# 2摊阀、繪制的條形位置(中心)
# 3、條形圖的高度(數(shù)據(jù)值)
width = 0.5
x_bar = np.arange(4)
# 第五步踪蹬,繪制條形圖的主體胞此,條形圖實(shí)質(zhì)上就是一系列的矩形元素,我們通過(guò)plt.bar函數(shù)來(lái)繪制條形圖
rect = ax1.bar(left=x_bar, height=data, width=width, color="lightblue", alpha=0.8, align='center')
# 第六步跃捣,向各條形上添加數(shù)據(jù)標(biāo)簽
for rec in rect:
x = rec.get_x()
height = rec.get_height()
ax1.text(x+0.1,1.02*height,str(height))
# 第七步漱牵,繪制x,y坐標(biāo)軸刻度及標(biāo)簽疚漆,標(biāo)題
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()
運(yùn)行結(jié)果如下:
接下來(lái)講解直方圖:
接下來(lái)酣胀,我們會(huì)講解直方圖。 直方圖非常像條形圖娶聘,傾向于通過(guò)將區(qū)段組合在一起來(lái)顯示分布灵临。 可能是年齡的分組,或測(cè)試的分?jǐn)?shù)趴荸。 我們并不是顯示每一組的數(shù)據(jù),而是按照 20 ~ 25宦焦,25 ~ 30… 等等來(lái)顯示數(shù)據(jù)发钝。 這里有一個(gè)例子:
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()
運(yùn)行結(jié)果如下:
散點(diǎn)圖
示例代碼:
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()
運(yùn)行結(jié)果如下:
餅狀圖
通常顿涣,餅圖用于顯示部分對(duì)于整體的情況,通常以%為單位酝豪。 幸運(yùn)的是涛碑,Matplotlib 會(huì)處理切片大小以及一切事情,我們只需要提供數(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()
運(yùn)行結(jié)果:
在plt.pie
中蒲障,我們需要指定『切片』,這是每個(gè)部分的相對(duì)大小瘫证。 然后揉阎,我們指定相應(yīng)切片的顏色列表。 接下來(lái)背捌,我們可以選擇指定圖形的『起始角度』毙籽。 這使你可以在任何地方開(kāi)始繪圖。 在我們的例子中毡庆,我們?yōu)轱瀳D選擇了 90 度角坑赡,這意味著第一個(gè)部分是一個(gè)豎直線條。 接下來(lái)么抗,我們可以選擇給繪圖添加一個(gè)字符大小的陰影毅否,然后我們甚至可以使用explode
拉出一個(gè)切片。
我們總共有四個(gè)切片蝇刀,所以對(duì)于explode
螟加,如果我們不想拉出任何切片,我們傳入0,0,0,0
熊泵。 如果我們想要拉出第一個(gè)切片仰迁,我們傳入0.1,0,0,0
。
最后顽分,我們使用autopct
徐许,選擇將百分比放置到圖表上面。
堆疊圖
堆疊圖用于顯示『部分對(duì)整體』隨時(shí)間的關(guān)系卒蘸。 堆疊圖基本上類(lèi)似于餅圖雌隅,只是隨時(shí)間而變化。
讓我們考慮一個(gè)情況缸沃,我們一天有 24 小時(shí)恰起,我們想看看我們?nèi)绾位ㄙM(fèi)時(shí)間。 我們將我們的活動(dòng)分為:睡覺(jué)趾牧,吃飯检盼,工作和玩耍。
我們假設(shè)我們要在 5 天的時(shí)間內(nèi)跟蹤它翘单,因此我們的初始數(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。然后貌亭,日期的各個(gè)成分保存在它們各自的活動(dòng)中柬唯。 像這樣繪制它們:
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()
運(yùn)行結(jié)果如下:
在這里,我們可以至少在顏色上看到圃庭,我們?nèi)绾位ㄙM(fèi)我們的時(shí)間锄奢。 問(wèn)題是,如果不回頭看代碼剧腻,我們不知道什么顏色是什么拘央。 下一個(gè)問(wèn)題是,對(duì)于多邊形來(lái)說(shuō)恕酸,我們實(shí)際上不能為數(shù)據(jù)添加『標(biāo)簽』堪滨。 因此,在任何不止是線條蕊温,帶有像這樣的填充或堆疊圖的地方袱箱,我們不能以固有方式標(biāo)記出特定的部分。 這不應(yīng)該阻止程序員义矛。 我們可以解決這個(gè)問(wèn)題:
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()
運(yùn)行結(jié)果如下: