百度echarts餅圖百分比的計算規(guī)則---最大余額法

最終結(jié)果呈現(xiàn)

最終百分比的顯示

怎么保證所有占比之和等于100%,什么是最大余額法?

echarts的餅圖的百度通過傳入數(shù)據(jù)自動算出每個項在總數(shù)當(dāng)中所占的比例大小堕花,且保證所有的比率相加等于100%未舟,那他是如何計算百分比的呢圈暗。通過閱讀源碼我們可以得知他使用最大余額法,那什么是最大余額法呢裕膀?

概念說明

那什么是最大余額方法呢员串?以下概念摘自維基百科,有一點(diǎn)晦澀難懂昼扛,下一節(jié)通過具體例子分析一下就好懂多了最大余額方法(英文:Largest Remainder Method)又稱數(shù)額制寸齐,是比例代表制投票制度下,一種議席分配的方法,相對于最高均數(shù)方法渺鹦。

透過最大余額方法扰法,候選人須以名單參選,每份名單的人數(shù)最多可達(dá)至相關(guān)選區(qū)內(nèi)的議席數(shù)目毅厚。候選人在名單內(nèi)按優(yōu)先次序排列迹恐。選民投票給一份名單,而不是個別候選人卧斟。投票結(jié)束后殴边,把有效選票除以數(shù)額(quota,見下)珍语。一份名單每取得數(shù)額1倍的票數(shù)锤岸,便能獲分配一個議席。每份名單的候選人按原先訂立的順序當(dāng)選板乙。

如此類推是偷、將議席分配至每份名單的余額,均比數(shù)額為低的時候募逞,則從最大余額者順序分配余下議席蛋铆;最大余額方法因而得名。

具體例子

假設(shè)選舉投票人次100,000放接,分配10個議席刺啦。選舉結(jié)果:

投票選舉

黑爾數(shù)額為黑爾數(shù)額為 100000/10 = 10000張選票,即每張名單每獲得10,000張選票纠脾,便能首先得到1個議席:

議席投票結(jié)果分析圖

因此玛瘸,名單丙、丁苟蹈、戊各得1席糊渊,名單己得4席。余下3席慧脱,則對比各個余額渺绒。其中名單乙、戊菱鸥、己的余額最大宗兼,因此分別獲選其余3席。

換言之采缚,在最大余額方法之下针炉,名單乙、丙扳抽、丁各得1席篡帕,名單戊得2席殖侵,名單己得5席。

源碼解析


看了以上的圖應(yīng)該對最大余額法有一點(diǎn)的了解了镰烧。那我們來看看源碼是如何通過最大余額法來進(jìn)行百分比分配的拢军。

以下通過一組例子數(shù)據(jù)來

數(shù)據(jù)值列表:[2, 4, 3]

精度:2(代表百分?jǐn)?shù)的值最多保留2位小數(shù))

期望結(jié)果: [ 22.22, 44.45, 33.33 ]

/**

*

* 給定一個精度值,計算某一項在一串?dāng)?shù)據(jù)中占據(jù)的百分比怔鳖,確保百分比總和是1(100%)

* 使用最大余額法

* @param {Array.} valueList a list of all data 一列數(shù)據(jù)

* @param {number} idx index of the data to be processed in valueList 索引值(數(shù)組下標(biāo))

* @param {number} precision integer number showing digits of precision 精度值

* @return {number} percent ranging from 0 to 100 返回百分比從0到100

*/

function getPercentWithPrecision (valueList, idx, precision) {

if (!valueList[idx]) {

return 0

? ? }

var sum = valueList.reduce(function (acc, val) {

return acc + (isNaN(val) ?0 : val)

}, 0)

if (sum ===0) {

return 0

? ? }

console.log('sum', sum)

// sum 9

? ? var digits = Math.pow(10, precision)// digits 100

? ? console.log('digits', digits)

var votesPerQuota = valueList.map(function (val) {

return (isNaN(val) ?0 : val) / sum * digits *100 // 擴(kuò)大比例茉唉,這樣可以確保整數(shù)部分是已經(jīng)確定的議席配額,小數(shù)部分是余額

? ? })

console.log('votesPerQuota', votesPerQuota)

// votesPerQuota [ 2222.222222222222, 4444.444444444444, 3333.333333333333 ] 每一個項獲得的議席配額结执,整數(shù)部分是已經(jīng)確定的議席配額度陆,小數(shù)部分是余額

? ? var targetSeats = digits *100 // targetSeats 10000 全部的議席

? ? console.log('targetSeats', targetSeats)

var seats = votesPerQuota.map(function (votes) {

// Assign automatic seats.

? ? ? ? return Math.floor(votes)

})

console.log('seats', seats)

// seats [ 2222, 4444, 3333 ] 獲取配額的整數(shù)部分

? ? var currentSum = seats.reduce(function (acc, val) {

return acc + val

}, 0)

console.log('currentSum', currentSum)

// 9999 表示已經(jīng)配額了9999個議席,還剩下一個議席

? ? var remainder = votesPerQuota.map(function (votes, idx) {

return votes - seats[idx]

})

console.log('remainder', remainder)

// [ 0.2222222222221717, 0.4444444444443434, 0.33333333333303017 ]得到每一項的余額

// Has remainding votes. 如果還有剩余的坐席就繼續(xù)分配

? ? while (currentSum < targetSeats) {

// Find next largest remainder. 找到下一個最大的余額

? ? ? ? var max = Number.NEGATIVE_INFINITY

var maxId =null

? ? ? ? for (var i =0, len = remainder.length; i < len; ++i) {

if (remainder[i] > max) {

max = remainder[i]

maxId = i

}

}

// max: 0.4444444444443434, maxId 1

// Add a vote to max remainder.

? ? ? ? ++seats[maxId]// 第二項献幔,即4的占比的坐席增加1

? ? ? ? remainder[maxId] =0

? ? ? ? ++currentSum// 總的已分配的坐席數(shù)也加1

? ? }

return seats[idx] / digits

}

參考鏈接


最大余額法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懂傀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜡感,更是在濱河造成了極大的恐慌蹬蚁,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郑兴,死亡現(xiàn)場離奇詭異犀斋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)情连,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門叽粹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒙具,你說我怎么就攤上這事球榆。” “怎么了禁筏?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長衡招。 經(jīng)常有香客問我篱昔,道長,這世上最難降的妖魔是什么始腾? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任州刽,我火速辦了婚禮,結(jié)果婚禮上浪箭,老公的妹妹穿的比我還像新娘穗椅。我一直安慰自己,他們只是感情好奶栖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布匹表。 她就那樣靜靜地躺著门坷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袍镀。 梳的紋絲不亂的頭發(fā)上默蚌,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音苇羡,去河邊找鬼绸吸。 笑死,一個胖子當(dāng)著我的面吹牛设江,可吹牛的內(nèi)容都是我干的锦茁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼叉存,長吁一口氣:“原來是場噩夢啊……” “哼码俩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鹉胖,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤握玛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后甫菠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挠铲,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年寂诱,在試婚紗的時候發(fā)現(xiàn)自己被綠了拂苹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡痰洒,死狀恐怖瓢棒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丘喻,我是刑警寧澤脯宿,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站泉粉,受9級特大地震影響连霉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗡靡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一跺撼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧讨彼,春花似錦歉井、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躏嚎。三九已至,卻和暖如春憨募,著一層夾襖步出監(jiān)牢的瞬間紧索,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工菜谣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留珠漂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓尾膊,卻偏偏與公主長得像媳危,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冈敛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容