您好,登錄后才能下訂單哦!
這篇“Matplotlib的bins和rwidth參數(shù)怎么實(shí)現(xiàn)”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Matplotlib的bins和rwidth參數(shù)怎么實(shí)現(xiàn)”文章吧。
我們?cè)谧鰴C(jī)器學(xué)習(xí)相關(guān)項(xiàng)目時(shí),常常會(huì)分析數(shù)據(jù)集的樣本分布,而這就需要用到直方圖的繪制。
在Python中可以很容易地調(diào)用matplotlib.pyplot的hist函數(shù)來繪制直方圖。不過,該函數(shù)參數(shù)不少,有幾個(gè)繪圖的小細(xì)節(jié)也需要注意。
首先,我們假定現(xiàn)在有個(gè)聯(lián)邦學(xué)習(xí)的項(xiàng)目情景。我們有一個(gè)樣本個(gè)數(shù)為15的圖片數(shù)據(jù)集,樣本標(biāo)簽有4個(gè),分別為cat, dog, car, ship。這個(gè)數(shù)據(jù)集已經(jīng)被不均衡地劃分到4個(gè)任務(wù)節(jié)點(diǎn)(client)上。 情境引入
我們?cè)谧鰴C(jī)器學(xué)習(xí)相關(guān)項(xiàng)目時(shí),常常會(huì)分析數(shù)據(jù)集的樣本分布,而這就需要用到直方圖的繪制。
在Python中可以很容易地調(diào)用matplotlib.pyplot
的hist
函數(shù)來繪制直方圖。不過,該函數(shù)參數(shù)不少,有幾個(gè)繪圖的小細(xì)節(jié)也需要注意。
首先,我們假定現(xiàn)在有個(gè)聯(lián)邦學(xué)習(xí)的項(xiàng)目情景。我們有一個(gè)樣本個(gè)數(shù)為15的圖片數(shù)據(jù)集,樣本標(biāo)簽有4個(gè),分別為cat
, dog
, car
, ship
。這個(gè)數(shù)據(jù)集已經(jīng)被不均衡地劃分到4個(gè)任務(wù)節(jié)點(diǎn)(client)上,如像下面表示:
N_CLIENTS = 3 num_cls, classes = 4, ['cat', 'dog', 'car', 'ship'] train_labels = [0, 3, 2, 0, 3, 2, 1, 0, 3, 3, 1, 0, 3, 2, 2] #數(shù)據(jù)集的標(biāo)簽列表 client_idcs = [slice(0, 4), slice(4, 11), slice(11, 15)] # 數(shù)據(jù)集樣本在client上的劃分情況
我們需要可視化樣本在任務(wù)節(jié)點(diǎn)的分布情況。我們第一次可能會(huì)寫出如下代碼:
import matplotlib.pyplot as plt import numpy as np plt.figure(figsize=(5,3)) plt.hist([train_labels[idc]for idc in client_idcs], stacked=False, bins=num_cls, label=["Client {}".format(i) for i in range(N_CLIENTS)]) plt.xticks(np.arange(num_cls), classes) plt.legend() plt.show()
此時(shí)的可視化結(jié)果如下:
這時(shí)我們會(huì)發(fā)現(xiàn),我們x軸上的標(biāo)簽和上方的bar(每個(gè)圖像類別對(duì)應(yīng)的3個(gè)bar合稱為1個(gè)bin)并沒有對(duì)齊,而這時(shí)劇需要我們調(diào)整bins
這個(gè)參數(shù)。
在講述bins參數(shù)之前我們先來熟悉一下hist
繪圖中bin和bar的含義。下面是它們的詮釋圖:
這里\(x_1\)、\(x_2\)是x軸對(duì)象,在hist
中,默認(rèn)x軸第一個(gè)對(duì)象對(duì)應(yīng)刻度為0,第2個(gè)對(duì)象刻度為1,依次類圖。在這個(gè)詮釋圖上,bin(原意為垃圾箱)就是指每個(gè)x軸對(duì)象所占優(yōu)的矩形繪圖區(qū)域,bar(原意為塊)就是指每個(gè)矩形繪圖區(qū)域中的條形。 如上圖所示,x軸第一個(gè)對(duì)象對(duì)應(yīng)的bin區(qū)間為[-0.5, 0.5),第2個(gè)對(duì)象對(duì)應(yīng)的bin區(qū)域?yàn)閇0.5, 1)(注意,hist
規(guī)定一定是左閉又開)。每個(gè)對(duì)象的bin區(qū)域內(nèi)都有3個(gè)bar。
通過查閱matplotlib
文檔,我們知道了bins
參數(shù)的解釋如下:
bins: int or sequence or str, default: rcParams["hist.bins"] (default: 10)
If bins is an integer, it defines the number of equal-width bins in the range.
If bins is a sequence, it defines the bin edges, including the left edge of the first bin and the right edge of the last bin; in this case, bins may be unequally spaced. All but the last (righthand-most) bin is half-open. In other words, if bins is:
[1, 2, 3, 4]then the first bin is [1, 2) (including 1, but excluding 2) and the second [2, 3). The last bin, however, is [3, 4], which includes 4.
If bins is a string, it is one of the binning strategies supported by numpy.histogram_bin_edges: 'auto', 'fd', 'doane', 'scott', 'stone', 'rice', 'sturges', or 'sqrt'.
我來概括一下,也就是說如果bins
是個(gè)數(shù)字,那么它設(shè)置的是bin的個(gè)數(shù),也就是沿著x軸劃分多少個(gè)獨(dú)立的繪圖區(qū)域。我們這里有四個(gè)圖像類別,故需要設(shè)置4個(gè)繪圖區(qū)域,每個(gè)區(qū)域相對(duì)于x軸刻度的偏移采取默認(rèn)設(shè)置。
不過,如果我們要設(shè)置每個(gè)區(qū)域的位置偏移,我們就需要將bins
設(shè)置為一個(gè)序列。
bins
序列的刻度要參照hist
函數(shù)中的x坐標(biāo)刻度來設(shè)置,本任務(wù)中4個(gè)分類類別對(duì)應(yīng)的x軸刻度分別為[0, 1, 2, 3]
。如果我們將序列設(shè)置為[0, 1, 2, 3, 4]
就表示第一個(gè)繪圖區(qū)域?qū)?yīng)的區(qū)間是[1, 2)
,第2個(gè)繪圖區(qū)域?qū)?yīng)的位置是[1, 2)
,第三個(gè)繪圖區(qū)域?qū)?yīng)的位置是[2, 3)
,依次類推。
就大眾審美而言,我們想讓每個(gè)區(qū)域的中心和對(duì)應(yīng)x軸刻度對(duì)齊,這第一個(gè)區(qū)域的區(qū)間為[-0.5, 0.5)
,第二個(gè)區(qū)域的區(qū)間為[0.5, 1.5)
,依次類推。則最終的bins
序列為[-0.5, 0.5, 1.5, 2.5, 3.5]
。于是,我們將hist
函數(shù)修改如下:
plt.hist([train_labels[idc]for idc in client_idcs], stacked=False, bins=np.arange(-0.5, 4, 1), label=["Client {}".format(i) for i in range(N_CLIENTS)])
這樣,每個(gè)劃分區(qū)域和對(duì)應(yīng)x軸的刻度就對(duì)齊了:
有時(shí)x軸的項(xiàng)目多了,每個(gè)x軸的對(duì)象都要設(shè)置3個(gè)bar對(duì)繪圖空間無疑是一個(gè)巨大的占用。在這個(gè)情況下我們?nèi)绾螇嚎s空間的使用呢?這個(gè)時(shí)候參數(shù)stacked
就派上了用場,我們將參數(shù)stacked
設(shè)置為True
:
plt.hist([train_labels[idc]for idc in client_idcs],stacked=True bins=np.arange(-0.5, 4, 1), label=["Client {}".format(i) for i in range(N_CLIENTS)])
可以看到每個(gè)x軸對(duì)象的bar都“疊加”起來了:
不過,新的問題又出來了,這樣每x軸對(duì)象的bar之間完全沒有距離了,顯得十分“擁擠”,我們可否修改bins
參數(shù)以設(shè)置區(qū)域bin之間的間距呢?答案是不行,因?yàn)槲覀兦懊嫣岬竭^,bins
參數(shù)中只能將區(qū)域設(shè)置為連續(xù)排布的。
換一個(gè)思路,我們?cè)O(shè)置每個(gè)bin內(nèi)的bar和bin邊界之間的間距。此時(shí),我們需要修改r_width
參數(shù)。
我們看文檔中對(duì)rwidth
參數(shù)的解釋:
rwidth float or None, default: None
The relative width of the bars as a fraction of the bin width. If None, automatically compute the width.
Ignored if histtype is 'step' or 'stepfilled'.
翻譯一下,rwidth
用于設(shè)置每個(gè)bin中的bar相對(duì)bin的大小。這里我們不妨修改為0.5:
plt.hist([train_labels[idc]for idc in client_idcs],stacked=True, bins=np.arange(-0.5, 4, 1), rwidth=0.5, label=["Client {}".format(i) for i in range(N_CLIENTS)])
修改之后的圖表如下:
可以看到每個(gè)x軸元素內(nèi)的bar正好占對(duì)應(yīng)bin的寬度的二分之一。
以上就是關(guān)于“Matplotlib的bins和rwidth參數(shù)怎么實(shí)現(xiàn)”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。