今天給大家系統(tǒng)介紹Matplotlib圖表層次結(jié)構(gòu),通過步驟分解,詳細了解一個圖表繪制的過程 。
?
Matplotlib圖表層次結(jié)構(gòu)
Figure圖形
Figure中最重要的元素是figure本身。在調(diào)用figure方法時創(chuàng)建的,可以指定它的長寬(figsize
)及分辨率(dpi
),也可以指定背景顏色(facecolor
)和標(biāo)題(suptitle
)。另外,當(dāng)保存圖形時,背景顏色將不會被使用,因為savefig函數(shù)也有一個faceccolor
參數(shù)(默認為白色),它將覆蓋您的圖形背景顏色。如果不想要任何背景,可以在保存圖形時指定transparent=True
。
Axes軸
這是第二個最重要的元素,它對應(yīng)于將呈現(xiàn)數(shù)據(jù)圖表的實際區(qū)域。它也被稱為subplot
子圖。每個figure可以有一個或多個axes軸,每個axes軸通常由四條邊(左、上、右、下)包圍,稱為spines
。每一根spines上都可以裝飾有主刻度和次刻度(可以指向內(nèi)部或外部)、刻度標(biāo)簽和標(biāo)簽。默認情況下,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)作,就像寫字需要先拿一張紙。畫布的大?。ㄩL寬比、分辨率)及刻度范圍可以先設(shè)置好,如果預(yù)先不知道刻度范圍,可以等繪圖結(jié)束后再做適當(dāng)調(diào)整。
![97dd7e90-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9vqAO6_IAADXe9O9S5w843.png)
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ū)ο蠼涌?/span>
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ū)ο蠼涌谥?,畫圖函數(shù)不再受到當(dāng)前 "活動" 圖形或坐標(biāo)軸的限制,而 變成了顯式的 Figure 和 Axes 的方法。
Step2 設(shè)置軸線
第二步,設(shè)置圖表Spines軸線。
![97f110a4-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9vqAOlkVAAD4_AHG35I592.png)
![9804b212-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9vqAKXkRAAD4WADksLw330.png)
圖形的軸線可以通過坐標(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ù)時:
![981b0b20-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9vqAK_wOAAEeLuPYmoQ776.png)
#移動left和bottomspines到(0,0)位置
ax.spines["left"].set_position(("data",0))
ax.spines["bottom"].set_position(("data",0))
#隱藏top和rightspines.
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
Step3 設(shè)置標(biāo)題
第三步,設(shè)置標(biāo)題, 就是用幾個簡短的字高度概括該圖形所要傳達的信息。
![9832a6ae-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9vuARU90AAFiKe2TD8c873.png)
通過ax.set_title
函數(shù)設(shè)置標(biāo)題。
ax.set_title("Anatomyofafigure(層次結(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)格可以輔助讀者更好直觀地量化圖形。
![9850b4b4-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9vuAIOGAAAKeuocT8MA041.png)
通過方法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'}
,默認為'major'
。'major'
為主刻度、'minor'
為次刻度。沒有輸入的方向則不會顯示網(wǎng)格刻度。 -
axis:選擇網(wǎng)格線顯示的軸。字符串,可選參數(shù),取值范圍為
{'both', 'x', 'y'}
,默認為'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ū)ο竺?/span>
#同時設(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')#pyplotapi命令-黑色背景
#方法 II:
ax1=plt.gca()
ax1.patch.set_facecolor("gray")#設(shè)置ax1區(qū)域背景顏色
ax1.patch.set_alpha(0.5)#設(shè)置ax1區(qū)域背景顏色透明度
③ 修改 matplotlib 默認參數(shù)
Matplotlib 每次加載時,都會定義一個運行時配置(rcParams),其中包含了 所有你創(chuàng)建的圖形元素的默認風(fēng)格。你可以用 mpl.rcParams 簡便方法隨時修 改這個配置。
mpl.rcParams['axes.facecolor']='red'
mpl.rcParams['savefig.facecolor']='red'
手動配置
![986f031a-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9vuAGbloAAJpwnaWXKU614.png)
#用灰色背景
fig=plt.figure(figsize=(8,8),
facecolor='#E6E6E6',#圖表區(qū)的背景色
edgecolor='black')
#畫上白色的網(wǎng)格線
ax.grid(color='grey',linestyle='-.')
#隱藏坐標(biāo)軸的線條
forspineinax.spines.values():
spine.set_visible(False)
#隱藏上邊與右邊的刻度ax.xaxis.tick_bottom()ax.yaxis.tick_left()
#弱化刻度與標(biāo)簽
ax.tick_params(colors='gray',direction='out')
fortickinax.get_xticklabels():
tick.set_color('gray')
fortickinax.get_yticklabels():
tick.set_color('gray')
使用默認配置樣式表
即使你不打算創(chuàng)建自己的繪圖風(fēng)格,樣式表包含的默認內(nèi)容也非常有 用。通過 plt.style.available 命令可以看到所有可用的風(fēng)格,
plt.style.available[:5]
[ 'fivethirtyeight', 'seaborn-pastel',
'seaborn-whitegrid', 'ggplot',
'grayscale']
使用某種樣式表的基本方法如下所示:
plt.style.use('ggplot')
![98840760-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9vuAOtlQAAKJl4DE1wQ868.png)
Step5 設(shè)置軸刻度
坐標(biāo)軸定位器與格式生成器
雖然 Matplotlib 默認的坐標(biāo)軸定位器(locator)與格式生成器 (formatter)可以滿足大部分需求,但是并非對每一幅圖都合適。
Tick Locator
Tick Locator 主要設(shè)置刻度位置,這在我的繪圖教程中主要是用來設(shè)置副刻度(minor
),而 Formatter 則是主要設(shè)置刻度形式。Matplotlib 對這兩者則有著多種用法,其中 Locator 的子類主要如下:
![98a433be-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9vyAGvrlAAHcNHB5yGs594.png)
Tick formatters
Tick formatters 設(shè)置刻度標(biāo)簽格式,主要對繪圖刻度標(biāo)簽定制化需求時,matplotlib 可支持修改的刻度標(biāo)簽形式如下。
![98b91392-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9vyAGTLTAAGd3t5ZBu4160.png)
部分代碼如下
importmatplotlib.tickerasticker
#MultipleLocator
axs[1].xaxis.set_major_locator(ticker.MultipleLocator(0.5))
axs[1].xaxis.set_minor_locator(ticker.MultipleLocator(0.1))
#IndexLocator
axs[4].plot(range(0,5),[0]*5,color='white')
axs[4].xaxis.set_major_locator(ticker.IndexLocator(base=0.5,offset=0.25))
#AutoLocator
axs[5].xaxis.set_major_locator(ticker.AutoLocator())
axs[5].xaxis.set_minor_locator(ticker.AutoMinorLocator())
#LogLocator
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))
#StrMethodformatter
setup(axs1[1],title="StrMethodFormatter('{x:.3f}')")
axs1[1].xaxis.set_major_formatter(ticker.StrMethodFormatter("{x:.3f}"))
#FuncFormattercanbeusedasadecorator
@ticker.FuncFormatter
defmajor_formatter(x,pos):
returnf'[{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'},選擇對哪個軸操作,默認是'both'
reset:bool,如果為True,則在處理其他參數(shù)之前將所有參數(shù)設(shè)置為默認值。它的默認值為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,Tickandlabelzorder.
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)容的對象。
![98d9af08-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9vyAfNs-AAMuN7IHwfk239.png)
#設(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("Xaxislabel")
ax.set_ylabel("Yaxislabel")
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ù),默認為
[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)。
fmt='[color][marker][line]'
color
(顏色)、marker
(標(biāo)記點)、line
(線條)都是可選的,例如如果指定 line 而不指定 marker
ax.plot(X,Y1,c=(0.25,0.25,1.00),lw=2,
label="Bluesignal",zorder=10)
ax.plot(X,Y2,c=(1.00,0.25,0.25),lw=2,
label="Redsignal")
ax.plot(X,Y3,linewidth=0,marker="o",
markerfacecolor="w",markeredgecolor="k")
![98f7d8a2-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9vyAM_SWAAS59vix5Jo845.png)
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ù),可以傳入位置字符串或位置代碼,如下:
Location String | Location Code |
---|---|
'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)準的 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)
foriinrange(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],['lineA','lineB'],
loc='upperright',frameon=False,fontsize=15)
#創(chuàng)建第二個圖例,通過add_artist方法添加到圖上
frommatplotlib.legendimportLegend
leg=Legend(ax,lines[2:],['lineC','lineD'],
loc='lowerright',frameon=False,fontsize=15)
ax.add_artist(leg)
![99178e2c-a916-11ec-952b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/A8/wKgaomTl9v2AHVzTAADRXYyFr0g815.png)
審核編輯 :李倩
-
matlab
+關(guān)注
關(guān)注
186文章
2981瀏覽量
231101 -
圖表
+關(guān)注
關(guān)注
0文章
33瀏覽量
8887
原文標(biāo)題:Matplotlib 可視化之圖表層次結(jié)構(gòu)
文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
包含層次結(jié)構(gòu)窗口完全空白
LabVIEW復(fù)制層次結(jié)構(gòu)后路徑過長
存儲器的層次結(jié)構(gòu)及其分類
存儲系統(tǒng)的層次結(jié)構(gòu)
存儲器的層次結(jié)構(gòu)主要體現(xiàn)在什么地方?為什么要分這些層次?
存儲器的層次結(jié)構(gòu)原理圖解分析
VxWorks下設(shè)備驅(qū)動的內(nèi)核結(jié)構(gòu)層次
![VxWorks下設(shè)備驅(qū)動的內(nèi)核<b class='flag-5'>結(jié)構(gòu)層次</b>](https://file.elecfans.com/web2/M00/4A/25/pYYBAGKhvKCAf_WwAAAmvEkGuwU258.png)
基于動作空間的自動構(gòu)造層次結(jié)構(gòu)方法
![基于動作空間的自動構(gòu)造<b class='flag-5'>層次</b><b class='flag-5'>結(jié)構(gòu)</b>方法](https://file.elecfans.com/web2/M00/49/70/poYBAGKhwLSACYGlAAAReKSForg991.jpg)
一種層次結(jié)構(gòu)中多維屬性的可視化方法
Python的Matplotlib函數(shù)匯總
python中matplotlib和seaborn介紹
![python中<b class='flag-5'>matplotlib</b>和seaborn介紹](https://file1.elecfans.com/web2/M00/A6/DB/wKgaomUgzDOAPf64AADSu-XCq_4664.jpg)
評論