Matplotlib簡(jiǎn)單教程

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)如下:
e421081632ff032d4abae155b6c60e3.png

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é)果如下圖所示:

cd70c40e004ab1e576ae1cebe2fb4e0.png

解釋

可見(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é)果如下:


1521697329(1).png

上面的程序中酒甸,我們?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é)果如下:


b6bf4f0e41c5cf79bc5c522f4465f0e.png

多圖多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é)果:


d3728dfc7bbdee61b2c2a9c4cbd1db8.png

條形圖和直方圖

有了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é)果如下:


bb26bcae769a810117a791fd147af9e.png

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é)果如下:


c54cfa53a29588414b1ce26b560e63d.png

接下來(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é)果如下:


acaf1770a7215d9b5f616653b08ef64.png

散點(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é)果如下:


4f022683d784490b4e569695a9cff1d.png

餅狀圖

通常顿涣,餅圖用于顯示部分對(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é)果:


image-20190123154113196.png

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é)果如下:


79a83b1380fb825a4d2039dc3004fab.png

在這里,我們可以至少在顏色上看到圃庭,我們?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é)果如下:


a6d73bd871f8157639d2e87cae164c5.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末发笔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凉翻,更是在濱河造成了極大的恐慌了讨,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件制轰,死亡現(xiàn)場(chǎng)離奇詭異前计,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)垃杖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)男杈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人调俘,你說(shuō)我怎么就攤上這事伶棒。” “怎么了彩库?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵肤无,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我骇钦,道長(zhǎng)宛渐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮窥翩,結(jié)果婚禮上畴蹭,老公的妹妹穿的比我還像新娘。我一直安慰自己鳍烁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布繁扎。 她就那樣靜靜地躺著幔荒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梳玫。 梳的紋絲不亂的頭發(fā)上爹梁,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音提澎,去河邊找鬼姚垃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盼忌,可吹牛的內(nèi)容都是我干的积糯。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谦纱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼看成!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起跨嘉,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤川慌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后祠乃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體梦重,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年亮瓷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琴拧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寺庄,死狀恐怖艾蓝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斗塘,我是刑警寧澤赢织,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站馍盟,受9級(jí)特大地震影響于置,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贞岭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一八毯、第九天 我趴在偏房一處隱蔽的房頂上張望搓侄。 院中可真熱鬧,春花似錦话速、人聲如沸讶踪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乳讥。三九已至,卻和暖如春廓俭,著一層夾襖步出監(jiān)牢的瞬間云石,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工研乒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汹忠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓雹熬,卻偏偏與公主長(zhǎng)得像宽菜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橄唬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 這篇筆記主要來(lái)自《利用python進(jìn)行數(shù)據(jù)分析》的第八章第一節(jié)赋焕,對(duì)matplotlib的基本使用介紹的特別清晰。關(guān)...
    ydlstartx閱讀 952評(píng)論 0 2
  • 前言 有時(shí)候?yàn)榱酥庇^仰楚,我們需要將數(shù)據(jù)可視化隆判,Python編程中最為常用的一個(gè)庫(kù)是matplotlib。那么什么是m...
    TensorFlow開(kāi)發(fā)者閱讀 5,326評(píng)論 2 47
  • matplotlib基礎(chǔ) matplotlib是面向?qū)ο蟮睦L圖工具包僧界,繪制的圖形中的每一個(gè)元素都是一個(gè)對(duì)象侨嘀,可以修...
    Alex_楊策閱讀 2,650評(píng)論 0 1
  • 在數(shù)據(jù)分析中,數(shù)據(jù)可視化非常重要捂襟。我們可以將數(shù)據(jù)繪制成各種圖形咬腕,比如直方圖,散點(diǎn)圖等葬荷,從圖形中可以明顯看出各種數(shù)據(jù)...
    Clemente閱讀 1,877評(píng)論 0 4
  • 2018.3.2 祝大家元宵節(jié)快樂(lè)~
    謙謙闋歌閱讀 73評(píng)論 0 0