99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀你了解matplotlib嗎?多類別條形圖篇
你了解matplotlib嗎?多類別條形圖篇
2020-05-29
收藏

這篇文章來探索下多類別條形圖比如各學(xué)校包含語文、數(shù)學(xué)、英語三科成績的條形圖怎樣繪制。在繪圖之前,先來復(fù)習(xí)一下條形圖函數(shù)中主要參數(shù)的含義:

  • x控制的是每個(gè)條在x軸方向上的位置;
  • height控制的是每個(gè)條的長度;
  • width控制的是每個(gè)條的寬度;
  • bottom控制的是每個(gè)條在y軸方向的起始位置
  • orientation控制的是條形的方向,是縱向還是橫向,默認(rèn)是縱向的。

小例子輔助理解:

x = [0.7, 1.5, 2, 3]
height = [3, 10, 12, 7]
plt.bar(x, height, width=0.3, bottom=[3, 0, 0, 1] )
plt.show()

參照代碼和圖形再理解下各個(gè)參數(shù)的作用。ok,萬事俱備,開始繪圖!

先看一下原數(shù)據(jù)data1長什么樣子再敲代碼:

plt.figure(figsize=(16,6))
x_s = np.array(list(range(0,20,2))) #設(shè)置語文成績的條形所在位置
plt.bar(x_s,data1.loc[:,"語文"].iloc[:10],width=0.5) #繪制語文成績的條形圖

x_y = np.array(list(range(0,20,2)))+0.5 #設(shè)置數(shù)學(xué)成績的條形所在位置
plt.bar(x_y,data1.loc[:,"數(shù)學(xué)"].iloc[:10],width=0.5) #繪制數(shù)學(xué)成績的條形圖

x_y = np.array(list(range(0,20,2)))+1 #設(shè)置英語成績的條形所在位置
plt.bar(x_y,data1.loc[:,"英語"].iloc[:10],width=0.5) #繪制英語成績的條形圖

plt.title("成績條形圖",fontsize = 14)
plt.ylabel("成績",fontsize = 14)
plt.xticks(x_s+0.5,data1.iloc[:,0].iloc[:10],fontsize = 12)
 #x軸刻度為各學(xué)校名稱,為了刻度正好在三個(gè)條形的正中間,設(shè)置(x_s+0.5)
plt.legend(["語文","數(shù)學(xué)","英語"]); 

坐標(biāo)軸和rc參數(shù)設(shè)置的講解中有提到過,在同一塊畫布上是可以重復(fù)繪圖的,其實(shí)在一幅條形圖中繪制多個(gè)類別的條形圖應(yīng)用的就是這個(gè)原理。需要注意的是不要讓后邊繪制的圖形覆蓋前邊繪制的圖形,所以需要提前計(jì)算好每個(gè)條形應(yīng)該畫在哪個(gè)地方。

通過代碼可以看到都進(jìn)行了哪些設(shè)置,每個(gè)條形的寬度都是0.5,所以在繪制好第一個(gè)學(xué)科的條形圖后,排在第二個(gè)位置進(jìn)行繪制的條形圖所有的條所在x軸的位置都在第一個(gè)學(xué)科條形位置的基礎(chǔ)上增加了0.5,第三個(gè)學(xué)科的條形又在第二個(gè)學(xué)科條形位置的基礎(chǔ)上再增加0.5的距離,這樣,每個(gè)學(xué)校的三個(gè)學(xué)科可以挨著展示出來又不會(huì)發(fā)生條形重疊的情況。

這里需要注意的另一個(gè)問題就是每個(gè)學(xué)??潭戎g要流出足夠的位置放置三個(gè)條形。每個(gè)條形的寬度都是0.5,一共需要1.5個(gè)位置,所以在設(shè)置刻度的時(shí)候,每個(gè)刻度之間的間隔(range(0,20,2)),一共10個(gè)刻度,對(duì)應(yīng)選取的10所學(xué)校,刻度間距為2,超過所需的1.5。

最終的效果圖:

圖是畫出來了,但是畫的過程中需要心算一下各種位置,除了各個(gè)條形的位置還有刻度的位置,著實(shí)有點(diǎn)麻煩,那么有沒有其他更簡便一點(diǎn)的方法呢?

DataFrame繪圖

先來和我們熟悉的matplotlib繪圖做對(duì)比,用matplotlib繪圖時(shí)先選擇繪圖函數(shù),然后把原數(shù)據(jù)作為參數(shù)傳入函數(shù)中,而dataframe直接繪圖的時(shí)候,類似調(diào)用了dataframe的方法,在通過參數(shù)選擇進(jìn)行哪種圖形的繪制。

干說沒實(shí)感,來段代碼感受下:

 #通過參數(shù)設(shè)置生成圖形的類型
data2.iloc[:10].plot(x = '學(xué)校',y = ['語文','數(shù)學(xué)','英語'],kind = "bar"
,figsize=(16,6),width=0.7,rot = 0,title = "各學(xué)科成績條形圖");

一行代碼搞定,先來看下效果圖:

是不是看起來和上邊matplotlib繪制的圖差不多,代碼卻簡潔了很多。先看下原dataframe長什么樣子:

接著具體研究下都是哪些參數(shù)在影響繪圖:

  • x和y沒有什么懸念,指定x軸和y軸數(shù)據(jù)來源,其中x的數(shù)據(jù)源是學(xué)校名稱,y軸是各個(gè)學(xué)科成績
  • kind參數(shù)控制的是繪制什么類型的圖,這里選擇是“bar”,即表示繪制條形圖,當(dāng)然還有其他的折線圖、餅圖、直方圖等等類型可以選擇
  • 其他的參數(shù)和matplotlib中的參數(shù)設(shè)置差不多,個(gè)別的參數(shù)會(huì)有差別,比如設(shè)置標(biāo)簽字體傾斜度的,在matplotlib中參數(shù)是rotation,在dataframe中的參數(shù)是rot,寫法有點(diǎn)不一樣,作用是一樣的,所以雖然沒有在代碼中進(jìn)行傾斜度的設(shè)置,還是把這個(gè)參數(shù)寫出來了,設(shè)置的傾斜度是0度,也就是沒傾斜。

這里寫出兩種方法實(shí)現(xiàn)相同的操作,在實(shí)際的工作中,按照需求自行選擇即可。

堆積條形圖

有時(shí)候,除了查看單個(gè)類別的情況,還需要同時(shí)查看總體的情況,這就是堆積條形圖擅長的領(lǐng)域了。繪制堆積條形圖和繪制普通條形圖用的都是plt.bar()函數(shù),也是通過參數(shù)設(shè)置實(shí)現(xiàn)堆積條形圖的繪制。

還是對(duì)參數(shù)設(shè)置不太熟的孩子可以回到文章開頭回憶下重要參數(shù)的作用,這里實(shí)現(xiàn)用語文、數(shù)學(xué)、英語三科成績的堆積條形圖

plt.figure(figsize=(16,6))
plt.bar(range(21),data1.loc[:,"語文"],width=0.9,label = "語文")
plt.bar(range(21),data1.loc[:,"數(shù)學(xué)"],bottom=np.array(data1.loc[:,"語文"]),width=0.9,label ="數(shù)學(xué)")
plt.bar(range(21),data1.loc[:,"英語"],bottom=np.array(data1.loc[:,"語文"]+data1.loc[:,"數(shù)學(xué)"])
        ,width=0.9,label ="英語")
totle_score = np.array(data1.loc[:,"語文"]+data1.loc[:,"數(shù)學(xué)"]+data1.loc[:,"英語"]).astype("int")
for i in range(21):
    plt.text(i-0.25,totle_score[i]+1,totle_score[i]) #為條形圖中的每個(gè)條添加標(biāo)簽
plt.title("各學(xué)校成績堆積圖",fontsize = 14)
plt.ylabel("成績",fontsize = 14)
plt.xticks(range(21),data1.iloc[:,0],rotation=30,fontsize = 12)#x軸刻度為各學(xué)校名稱
plt.legend() #顯示圖例;

原理和前邊畫三科成績條形圖一樣,都是在同一塊畫布上重復(fù)繪圖,注意繪圖的邏輯即可。這里是先畫一個(gè)學(xué)科成績的縱向條形圖,通過bottom參數(shù)控制第二個(gè)學(xué)科成績繪圖時(shí)在y軸方向的起始值,也就是在第一科學(xué)科成績條形的頂端接著畫第二科學(xué)科成績的條,然后在第二科成績條形的頂端繼續(xù)畫第三個(gè)學(xué)科成績的條形,這樣形成的就是堆積條形圖

當(dāng)然還有一些細(xì)節(jié)需要注意,比如三個(gè)學(xué)科條形的寬度得設(shè)置成一樣的尺寸,避免影響美觀。

細(xì)心的孩子可能已經(jīng)發(fā)現(xiàn)了一點(diǎn)新鮮的設(shè)置:多了一個(gè)函數(shù)plt.text(),這個(gè)函數(shù)的作用是在條形的頂端添加了該條形的標(biāo)簽,即三科的總成績。因?yàn)橐獙?duì)每個(gè)條形增加一個(gè)標(biāo)簽,所以運(yùn)用了循環(huán),將總分作為標(biāo)簽添加到了圖形中。

通過plt.text()函數(shù)可以在整幅圖的任意位置添加需要的文本進(jìn)去。函數(shù)的第一個(gè)參數(shù)控制文本在x軸方向的位置,第二個(gè)參數(shù)控制文本在y軸方向的位置,第三個(gè)參數(shù)為添加的文本信息。

啰里啰唆說了這么多,來看下堆積條形圖的效果:

和常見的堆積條形圖沒什么不一樣對(duì)吧,其實(shí)條形圖依然又值得深挖的地方,還有很多有意思的設(shè)置可以嘗試呢。來個(gè)預(yù)告,計(jì)劃在下一篇文章離探索一下發(fā)散型條形圖。

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }