一.概述
1. matplotlib的三層api
matplotlib的原理或者說(shuō)基礎(chǔ)邏輯是,用Artist對(duì)象在畫布(canvas)上繪制(Render)圖形。更通俗點(diǎn)的理解就是Artist的作用是調(diào)用畫筆來(lái)繪制出想要的圖形,canvas是個(gè)承接內(nèi)容的畫布,Render是畫筆。
FigureCanvas:
matplotlib.backend_bases.FigureCanvas 代表了繪圖區(qū),所有的圖像都是在繪圖區(qū)完成的。
Renderer:
matplotlib.backend_bases.Renderer 代表了渲染器,可以近似理解為畫筆,控制如何在 FigureCanvas 上畫圖。
Artist:
matplotlib.artist.Artist 代表了具體的圖表組件,即調(diào)用了Renderer的接口在Canvas上作圖,具體的調(diào)用接口來(lái)做出我們想要的圖,比如圖形、文本、線條的設(shè)定。
2.Artist的分類
Artist有兩種類型:primitives 和containers。
primitive是基本要素,它包含一些我們要在繪圖區(qū)作圖用到的標(biāo)準(zhǔn)圖形對(duì)象,如曲線Line2D,文字text,矩形Rectangle,圖像image等。
container是容器,即用來(lái)裝基本要素的地方,包括圖形figure、坐標(biāo)系A(chǔ)xes和坐標(biāo)軸Axis。
兩者的關(guān)系可以通俗的理解為contaniner包含primitives。
可視化中常見的artist類可以參考下圖這張表格:
Axes helper method ? ?Artist ? ?Container
bar - bar charts ? ?Rectangle ? ?ax.patches
errorbar - error bar plots ? ?Line2D and Rectangle ? ?ax.lines and ax.patches
fill - shared area ? ?Polygon ? ?ax.patches
hist - histograms ? ?Rectangle ? ?ax.patches
imshow - image data ? ?AxesImage ? ?ax.images
plot - xy plots ? ?Line2D ? ?ax.lines
scatter - scatter charts ? ?PolyCollection ? ?ax.collections
現(xiàn)對(duì)上表進(jìn)行解釋:
第一列:表示matplotlib中子圖(子圖的概念可以參考我的博客里的task1)上的輔助方法,可以理解為可視化中不同種類的圖表類型,如柱狀圖,折線圖,直方圖等,這些圖表都可以用這些輔助方法直接畫出來(lái),屬于更高層級(jí)的抽象。
第二列:表示不同圖表背后的artist類,比如折線圖方法plot在底層用到的就是Line2D這一artist類。
第三列:是第二列的列表容器,例如所有在子圖中創(chuàng)建的Line2D對(duì)象都會(huì)被自動(dòng)收集到ax.lines返回的列表中。
二.基本元素-primitives
primitives 的幾種類型:曲線-Line2D,矩形-Rectangle,多邊形-Polygon,圖像-image。
1. 2DLines
在matplotlib中曲線的繪制,主要是通過類 matplotlib.lines.Line2D 來(lái)完成的。
matplotlib中線-line的含義:它表示的可以是連接所有頂點(diǎn)的實(shí)線樣式,也可以是每個(gè)頂點(diǎn)的標(biāo)記。此外,這條線也會(huì)受到繪畫風(fēng)格的影響,比如,我們可以創(chuàng)建虛線種類的線。
其中常用的的參數(shù)有:
? ? xdata:需要繪制的line中點(diǎn)的在x軸上的取值,若忽略,則默認(rèn)為range(1,len(ydata)+1)
? ? ydata:需要繪制的line中點(diǎn)的在y軸上的取值
? ? linewidth:線條的寬度
? ? linestyle:線型
? ? color:線條的顏色
? ? marker:點(diǎn)的標(biāo)記,詳細(xì)可參考markers API
? ? markersize:標(biāo)記的size
其他詳細(xì)參數(shù)可參考Line2D官方文檔
a. 如何設(shè)置Line2D的屬性
有三種方法可以用設(shè)置線的屬性。
? ? 直接在plot()函數(shù)中設(shè)置
? ? 通過獲得線對(duì)象,對(duì)線對(duì)象進(jìn)行設(shè)置
? ? 獲得線屬性,使用setp()函數(shù)設(shè)置
其實(shí)下列例子和matlab繪圖比較相似,可以聯(lián)想理解
import numpy as np
import pandas as pd
import re
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
from matplotlib.patches import Circle, Wedge
from matplotlib.collections import PatchCollection
# 1) 直接在plot()函數(shù)中設(shè)置
x = range(0,5)
y = [2,5,7,8,10]
plt.plot(x,y, linewidth=10); # 設(shè)置線的粗細(xì)參數(shù)為10
plt.show()
import numpy as np
import pandas as pd
import re
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
from matplotlib.patches import Circle, Wedge
from matplotlib.collections import PatchCollection
?
# 2) 通過獲得線對(duì)象,對(duì)線對(duì)象進(jìn)行設(shè)置
x = range(0,5)
y = [2,5,7,8,10]
line, = plt.plot(x, y, '-') # 這里等號(hào)坐標(biāo)的line,是一個(gè)列表解包的操作,目的是獲取plt.plot返回列表中的Line2D對(duì)象
line.set_antialiased(False); # 關(guān)閉抗鋸齒功能
plt.show()