Matplotlib 可视化之图表层次结构
今天云朵君給大家系統(tǒng)介紹Matplotlib圖表層次結(jié)構(gòu),通過步驟分解,詳細(xì)了解一個圖表繪制的過程 。
?
Matplotlib圖表層次結(jié)構(gòu)
Figure圖形
Figure中最重要的元素是figure本身。在調(diào)用figure方法時創(chuàng)建的,可以指定它的長寬(figsize)及分辨率(dpi),也可以指定背景顏色(facecolor)和標(biāo)題(suptitle)。另外,當(dāng)保存圖形時,背景顏色將不會被使用,因為savefig函數(shù)也有一個faceccolor參數(shù)(默認(rèn)為白色),它將覆蓋您的圖形背景顏色。如果不想要任何背景,可以在保存圖形時指定transparent=True。
Axes軸
這是第二個最重要的元素,它對應(yīng)于將呈現(xiàn)數(shù)據(jù)圖表的實際區(qū)域。它也被稱為subplot子圖。每個figure可以有一個或多個axes軸,每個axes軸通常由四條邊(左、上、右、下)包圍,稱為spines。每一根spines上都可以裝飾有主刻度和次刻度(可以指向內(nèi)部或外部)、刻度標(biāo)簽和標(biāo)簽。默認(rèn)情況下,matplotlib只裝飾左邊和下面的spines邊框。
Axis軸
有刻度的spines邊線稱為軸。水平的是x軸,垂直的是y軸。每個軸每一個都是由一個spines軸線,主刻度、次刻度、主刻度標(biāo)簽、次刻度標(biāo)簽和一個軸標(biāo)簽組成。
Spines軸線
Spines是連接軸刻度線和數(shù)據(jù)區(qū)域邊界的軸線。它們可以被放置在任意位置,可以選擇展示或隱藏它們。
第一步,設(shè)置畫布大小、調(diào)整坐標(biāo)軸范圍 ?
第二步,設(shè)置圖表邊框格式 ?
第三步,設(shè)置圖表標(biāo)題 ?
第四步,設(shè)置圖表的網(wǎng)格 ?
第五步,設(shè)置軸刻度 ?
第六步,繪圖 ?
第七步,配置圖例
Step1設(shè)置畫布
第一步,設(shè)置畫布大小、調(diào)整坐標(biāo)軸范圍。
首先需要有畫布,才能在上面創(chuàng)作,就像寫字需要先拿一張紙。畫布的大小(長寬比、分辨率)及刻度范圍可以先設(shè)置好,如果預(yù)先不知道刻度范圍,可以等繪圖結(jié)束后再做適當(dāng)調(diào)整。
設(shè)置畫布fig?=?plt.figure(figsize=(8,?8)) ax?=?fig.add_subplot(1,?1,?1,?aspect=1) ax.set_xlim(0,?4) ax.set_ylim(0,?4)Matplotlib有兩種畫圖接口:①是便捷的 MATLAB 風(fēng)格接口,②是功能更強大的面向?qū)ο蠼涌凇?/p>
MATLAB風(fēng)格接口
MATLAB 風(fēng)格的工具位于pyplot(plt) 接口中。plt.xx之類的是 函數(shù)式繪圖,通過將數(shù)據(jù)參數(shù)傳入 plt類 的靜態(tài)方法中并調(diào)用方法,從而繪圖。
這種接口最重要的特性是有狀態(tài)的:它會持續(xù)跟蹤 "當(dāng)前的" 圖形和坐標(biāo)軸,所有 plt 命令都可以應(yīng)用。可以用 plt.gcf() (獲取當(dāng)前圖形)和 plt.gca()(獲取當(dāng)前坐標(biāo)軸)來查看具體信息。
面向?qū)ο蠼涌?/h3>
fig,ax=plt.subplots()是對象式編程,這里plt.subplots()是返回一個元組,包含了 figure 對象(控制總體圖形大小)和 axes 對象(控制繪圖,坐標(biāo)之類的)。此外fig.add_subplot()也是相同的道理。
進行對象式繪圖,首先是要通過plt.subplots()將 figure 類和 axes 類實例化也就是代碼中的fig,ax,然后通過 fig 調(diào)整整體圖片大小,通過 ax 繪制圖形,設(shè)置坐標(biāo),函數(shù)式繪圖最大的好處就是直觀。
面向?qū)ο蠼涌诳梢赃m應(yīng)更復(fù)雜的場景,更好地控制你自己的圖形。在面 向?qū)ο蠼涌谥?#xff0c;畫圖函數(shù)不再受到當(dāng)前 "活動" 圖形或坐標(biāo)軸的限制,而 變成了顯式的 Figure 和 Axes 的方法。
Step2 設(shè)置軸線
第二步,設(shè)置圖表Spines軸線。
設(shè)置軸線隱藏軸線圖形的軸線可以通過坐標(biāo)軸屬性ax.spines設(shè)置,最常見的設(shè)置方法是選擇隱藏,通過屬性['top', 'bottom', 'left', 'right']分別設(shè)置上下左右的軸線。
ax.spines.right.set_visible(False) ax.spines.bottom.set_visible(False)還有另一種經(jīng)常使用的情況,根據(jù)繪圖需要,調(diào)整 spines 軸線在圖中位置。如繪制正余弦函數(shù)時:
移動軸線#?移動?left?和?bottom?spines?到?(0,0)?位置 ax.spines["left"].set_position(("data",?0)) ax.spines["bottom"].set_position(("data",?0)) #?隱藏?top?和?right?spines. ax.spines["top"].set_visible(False) ax.spines["right"].set_visible(False)Step3 設(shè)置標(biāo)題
第三步,設(shè)置標(biāo)題, 就是用幾個簡短的字高度概括該圖形所要傳達(dá)的信息。
設(shè)置標(biāo)題通過ax.set_title函數(shù)設(shè)置標(biāo)題。
ax.set_title("Anatomy?of?a?figure?(層次結(jié)構(gòu))",?fontsize=20,?verticalalignment="bottom")matplotlib.axes.Axes.set_title()
ax.set_title()是給ax這個子圖設(shè)置標(biāo)題,當(dāng)子圖存在多個的時候,可以通過ax設(shè)置不同的標(biāo)題。如果需要設(shè)置一個總的標(biāo)題,可以通過fig.suptitle('Total title')方法設(shè)置。
Axes.set_title(label,?fontdict=None,loc='center',?pad=None,**kwargs)參數(shù):
label:此參數(shù)是用于標(biāo)題的文本。
fontdict:此參數(shù)是控制標(biāo)題文本外觀的字典。
loc:此參數(shù)用于設(shè)置標(biāo)題{'center','left','right'}的位置。
pad:此參數(shù)是標(biāo)題距軸頂部的偏移量(以磅為單位)。
Step4 設(shè)置網(wǎng)格
第四步,設(shè)置圖表的網(wǎng)格, 圖表網(wǎng)格屬于圖形配置的一種。網(wǎng)格可以輔助讀者更好直觀地量化圖形。
設(shè)置網(wǎng)格通過方法ax.grid()添加網(wǎng)格線。
ax.grid(linestyle="--",?linewidth=0.5,?color=".25",?zorder=-10)matplotlib.axes.Axes.grid()
Axes.grid(b=None,?which='major',axis='both',?**kwargs)參數(shù):
b:是否顯示網(wǎng)格線。布爾值或None,可選參數(shù)。如果沒有關(guān)鍵字參數(shù),則b為True,如果b為None且沒有關(guān)鍵字參數(shù),相當(dāng)于切換網(wǎng)格線的可見性。
which:網(wǎng)格線顯示的尺度。字符串,可選參數(shù),取值范圍為{'major', 'minor', 'both'},默認(rèn)為'major'。'major'為主刻度、'minor'為次刻度。沒有輸入的方向則不會顯示網(wǎng)格刻度。
axis:選擇網(wǎng)格線顯示的軸。字符串,可選參數(shù),取值范圍為{'both', 'x', 'y'},默認(rèn)為'both'。
**kwargs:Line2D線條對象屬性。常用的
color : 這就不用多說了,就是設(shè)置網(wǎng)格線的顏色。或者直接用c來代替color也可以。
linestyle : 也可以用ls來代替linestyle, 設(shè)置網(wǎng)格線的風(fēng)格,是連續(xù)實線,虛線或者其它不同的線條。| '-' | '--' | '-.' | ':' | 'None' | ' ' | ''|
linewidth : 設(shè)置網(wǎng)格線的寬度
zorder: 設(shè)置層次順序
另外還有幾種不同設(shè)置網(wǎng)格線的方法:
plt.grid(true) #?設(shè)置網(wǎng)格線格式: plt.grid(color='r',??linestyle='--',linewidth=1,?alpha=0.3)?#?使用?axes?類面向?qū)ο竺?#?同時設(shè)置橫豎坐標(biāo)軸上的網(wǎng)格線 ax.grid(color='r',?linestyle='--',linewidth=1,alpha=0.3)#?單獨設(shè)置X坐標(biāo)軸上(垂直方向)的網(wǎng)格線 ax.xaxis.grid(color='r',?linestyle='--',linewidth=1,?alpha=0.3)#?單獨設(shè)置Y坐標(biāo)軸上(水平方向)的網(wǎng)格線 ax.yaxis.grid(color='r',?linestyle='--',linewidth=1,alpha=0.3)圖形配置
手動設(shè)置背景色的幾種方法
① 設(shè)置 figure 背景顏色
#?方法 I: plt.figure(facecolor='blue',????#?圖表區(qū)的背景色edgecolor='black')????#?圖表區(qū)的邊框線顏色#?方法 II: fig=plt.gcf() fig.set_facecolor('green')② 設(shè)置 axes 背景顏色
#?方法 I: a?=?plt.axes([.65,?.6,?.2,?.2],facecolor='k')??#?pyplot?api?命令-黑色背景 #?方法 II: ax1=plt.gca() ax1.patch.set_facecolor("gray")????#?設(shè)置?ax1?區(qū)域背景顏色??????????????? ax1.patch.set_alpha(0.5)????#?設(shè)置?ax1?區(qū)域背景顏色透明度③ 修改 matplotlib 默認(rèn)參數(shù)
Matplotlib 每次加載時,都會定義一個運行時配置(rcParams),其中包含了 所有你創(chuàng)建的圖形元素的默認(rèn)風(fēng)格。你可以用 mpl.rcParams 簡便方法隨時修 改這個配置。
mpl.rcParams['axes.facecolor']='red' mpl.rcParams['savefig.facecolor']='red'手動配置
手動配置#?用灰色背景 fig?=?plt.figure(figsize=(8,?8),facecolor='#E6E6E6',????#?圖表區(qū)的背景色edgecolor='black') #?畫上白色的網(wǎng)格線 ax.grid(color='grey',?linestyle='-.') #?隱藏坐標(biāo)軸的線條 for?spine?in?ax.spines.values():spine.set_visible(False) #?隱藏上邊與右邊的刻度?ax.xaxis.tick_bottom()?ax.yaxis.tick_left() #?弱化刻度與標(biāo)簽 ax.tick_params(colors='gray',?direction='out')for?tick?in?ax.get_xticklabels():tick.set_color('gray') for?tick?in?ax.get_yticklabels():tick.set_color('gray')使用默認(rèn)配置樣式表
即使你不打算創(chuàng)建自己的繪圖風(fēng)格,樣式表包含的默認(rèn)內(nèi)容也非常有 用。通過 plt.style.available 命令可以看到所有可用的風(fēng)格,
plt.style.available[:5][ 'fivethirtyeight', 'seaborn-pastel', 'seaborn-whitegrid', 'ggplot', 'grayscale']使用某種樣式表的基本方法如下所示:
plt.style.use('ggplot')默認(rèn)配置Step5 設(shè)置軸刻度
坐標(biāo)軸定位器與格式生成器
雖然 Matplotlib 默認(rèn)的坐標(biāo)軸定位器(locator)與格式生成器 (formatter)可以滿足大部分需求,但是并非對每一幅圖都合適。
Tick Locator
Tick Locator 主要設(shè)置刻度位置,這在我的繪圖教程中主要是用來設(shè)置副刻度(minor),而 Formatter 則是主要設(shè)置刻度形式。Matplotlib 對這兩者則有著多種用法,其中 Locator 的子類主要如下:
Tick LocatorTick formatters
Tick formatters 設(shè)置刻度標(biāo)簽格式,主要對繪圖刻度標(biāo)簽定制化需求時,matplotlib 可支持修改的刻度標(biāo)簽形式如下。
Tick formatters部分代碼如下
import?matplotlib.ticker?as?ticker#?Multiple?Locator axs[1].xaxis.set_major_locator(ticker.MultipleLocator(0.5)) axs[1].xaxis.set_minor_locator(ticker.MultipleLocator(0.1))#?Index?Locator axs[4].plot(range(0,?5),?[0]*5,?color='white') axs[4].xaxis.set_major_locator(ticker.IndexLocator(base=0.5,?offset=0.25))#?Auto?Locator axs[5].xaxis.set_major_locator(ticker.AutoLocator()) axs[5].xaxis.set_minor_locator(ticker.AutoMinorLocator())#?Log?Locator axs[7].set_xlim(10**3,?10**10) axs[7].set_xscale('log') axs[7].xaxis.set_major_locator(ticker.LogLocator(base=10,?numticks=15))#?StrMethod?formatter setup(axs1[1],?title="StrMethodFormatter('{x:.3f}')") axs1[1].xaxis.set_major_formatter(ticker.StrMethodFormatter("{x:.3f}"))#?FuncFormatter?can?be?used?as?a?decorator @ticker.FuncFormatter def?major_formatter(x,?pos):return?f'[{x:.2f}]' setup(axs1[2],?title='FuncFormatter("[{:.2f}]".format') axs1[2].xaxis.set_major_formatter(major_formatter)刻度標(biāo)簽參數(shù)
更改刻度、刻度標(biāo)簽和網(wǎng)格線的外觀。
matplotlib.axes.Axes.tick_params()
Axes.tick_params(axis='both',?**kwargs)主要參數(shù):
axis : 可選{'x', 'y', 'both'} ,選擇對哪個軸操作,默認(rèn)是'both' reset : bool,如果為True,則在處理其他參數(shù)之前將所有參數(shù)設(shè)置為默認(rèn)值。它的默認(rèn)值為False。 which : 可選{'major', 'minor', 'both'} 選擇對主or副坐標(biāo)軸進行操作 direction/tickdir : 可選{'in', 'out', 'inout'}刻度線的方向 size/length : float, 刻度線的長度 width : float, 刻度線的寬度 color : 刻度線的顏色,我一般用16進制字符串表示,eg:'#EE6363' pad : float, 刻度線與刻度值之間的距離 labelsize : float/str, 刻度值字體大小 labelcolor : 刻度值顏色 colors : 同時設(shè)置刻度線和刻度值的顏色 zorder : float ,Tick and label zorder. bottom, top, left, right : bool, 分別表示上下左右四邊,是否顯示刻度線,True為顯示 labelbottom, labeltop, labelleft, labelright:bool, 分別表示上下左右四邊,是否顯示刻度值,True為顯示 labelrotation : 刻度值逆時針旋轉(zhuǎn)給定的度數(shù),如20 gridOn: bool ,是否添加網(wǎng)格線; grid_alpha:float網(wǎng)格線透明度 ; grid_color: 網(wǎng)格線顏色; grid_linewidth:float網(wǎng)格線寬度; grid_linestyle: 網(wǎng)格線型 tick1On, tick2On : bool分別表表示是否顯示axis軸的(左/下、右/上)or(主、副)刻度線 label1On,label2On : bool分別表表示是否顯示axis軸的(左/下、右/上)or(主、副)刻度值可以將每個 Matplotlib 對象都看成是子對象(sub- object)的容器,例如每個 figure 都會包含一個或多個 axes 對象,每個 axes 對象又會包含其他表示圖形內(nèi)容的對象。
設(shè)置軸刻度#?設(shè)置主次刻度軸 ax.xaxis.set_major_locator(MultipleLocator(1.000)) ax.xaxis.set_minor_locator(AutoMinorLocator(4)) ax.yaxis.set_major_locator(MultipleLocator(1.000)) ax.yaxis.set_minor_locator(AutoMinorLocator(4)) ax.xaxis.set_minor_formatter(FuncFormatter(minor_tick)) #?設(shè)置刻度軸范圍 ax.set_xlim(0,?4) ax.set_ylim(0,?4) #?設(shè)置刻度參數(shù) ax.tick_params(which="major",?width=1.0) ax.tick_params(which="major",?length=10) ax.tick_params(which="minor",?width=1.0,?labelsize=10) ax.tick_params(which="minor",?length=5,?labelsize=10,?labelcolor="0.25") #?設(shè)置軸標(biāo)簽 ax.set_xlabel("X?axis?label") ax.set_ylabel("Y?axis?label")Step6 繪圖
matplotlib.axes.Axes.plot()
Axes.plot([x],?y,?[fmt],?data=None,?**kwargs)用于繪制XY坐標(biāo)系的點、線或其他標(biāo)記形狀。
參數(shù):
x, y: 類數(shù)組或極坐標(biāo)。水平/垂直坐標(biāo)系中的數(shù)據(jù)點,x是可選參數(shù),默認(rèn)為[0,..., N-1]。?通常,參數(shù)x,y是長度為N的數(shù)組,也支持極坐標(biāo)(相當(dāng)于一個常數(shù)值數(shù)組)。?參數(shù)也可以是二維的,此時,每一列代表一個數(shù)據(jù)集。
fmt: 字符串,可選參數(shù)。格式化字符串,例如'ro'代表紅色圓圈。格式字符串是用于快速設(shè)置基本線條樣式的縮寫,這些樣式或更多的樣式可通過關(guān)鍵字參數(shù)來實現(xiàn)。
color(顏色)、marker(標(biāo)記點)、line(線條)都是可選的,例如如果指定 line 而不指定 marker
ax.plot(X,?Y1,?c=(0.25,?0.25,?1.00),?lw=2,?label="Blue?signal",?zorder=10) ax.plot(X,?Y2,?c=(1.00,?0.25,?0.25),?lw=2,?label="Red?signal") ax.plot(X,?Y3,?linewidth=0,?marker="o",?markerfacecolor="w",?markeredgecolor="k")繪圖Step7 配置圖例
想在可視化圖形中使用圖例,可以為不同的圖形元素分配標(biāo)簽。
matplotlib.axes.Axes.legend()
可以用 Axes.legend()命令來創(chuàng)建最簡單的圖例。
Axes.legend(*args,?**kwargs)參數(shù):
labels:這個參數(shù)是在旁邊顯示的標(biāo)簽列表。
handles:這個參數(shù)列表是要添加到示例的。
loc: 位置參數(shù),常用參數(shù),可以傳入位置字符串或位置代碼,如下:
| 'best' | 0 |
| 'upper right' | 1 |
| 'upper left' | 2 |
| 'lower left' | 3 |
| 'lower right' | 4 |
| 'right' | 5 |
| 'center left' | 6 |
| 'center right' | 7 |
| 'lower center' | 8 |
| 'upper center' | 9 |
| 'center' | 10 |
同時顯示多個圖例
有時,我們可能需要在同一張圖上顯示多個圖例。用 Matplotlib 通過標(biāo)準(zhǔn)的 legend 接口只能為一張圖建一個圖例。如果你想用 plt.legend() 或 ax.legend() 方法創(chuàng)建第二個圖例,那么第一個圖例就會被覆蓋。但是,我們可以通過從頭開始創(chuàng)建一個新的圖例對象(legend artist),然后用底層的(lower- level)ax.add_artist() 方法在圖上添加第二個圖例。
fig,?ax?=?plt.subplots(figsize=(10,6)) lines?=?[] styles?=?['-',?'--',?'-.',?':']? x?=?np.linspace(0,?10,?1000) for?i?in?range(4):lines?+=?ax.plot(x,?np.sin(x?-?i?*?np.pi?/?2),?styles[i],?color='black') ax.axis('equal') #?設(shè)置第一個圖例要顯示的線條和標(biāo)簽? ax.legend(lines[:2],?['line?A',?'line?B'],loc='upper?right',?frameon=False,fontsize=15) #?創(chuàng)建第二個圖例,通過add_artist方法添加到圖上 from?matplotlib.legend?import?Legend leg?=?Legend(ax,?lines[2:],?['line?C',?'line?D'],loc='lower?right',?frameon=False,?fontsize=15)? ax.add_artist(leg)參考資料
[1]
?Scientific Visualisation-Python & Matplotlib ??
?Python數(shù)據(jù)科學(xué)手冊
END
各位伙伴們好,詹帥本帥搭建了一個個人博客和小程序,匯集各種干貨和資源,也方便大家閱讀,感興趣的小伙伴請移步小程序體驗一下哦!(歡迎提建議)推薦閱讀
牛逼!Python常用數(shù)據(jù)類型的基本操作(長文系列第①篇)
牛逼!Python的判斷、循環(huán)和各種表達(dá)式(長文系列第②篇)
牛逼!Python函數(shù)和文件操作(長文系列第③篇)
牛逼!Python錯誤、異常和模塊(長文系列第④篇)
總結(jié)
以上是生活随笔為你收集整理的Matplotlib 可视化之图表层次结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌大一统?Fuchsia OS已可提供
- 下一篇: 我发现了pandas的黄金搭档!