python繪制簡單直方圖的方法
直方圖,又稱質(zhì)量分布圖,是一種統(tǒng)計(jì)報(bào)告圖,由一系列高度不等的縱條或線段表示數(shù)據(jù)分布情況。用橫軸表示數(shù)據(jù)類型,縱軸表示分布情況。直方圖是數(shù)值數(shù)據(jù)分布的精確圖形表示。繪制連續(xù)性的數(shù)據(jù),展示一組或多組數(shù)據(jù)的分布狀況。
直方圖的繪制和條形圖有些相似,需要把plt.bar()修改成plt.hist(),更改圖形的擬合方式,即可繪制直方圖。例如你獲取到了250部電影的數(shù)量,他們的時(shí)長都在80-140分鐘,如何呈現(xiàn)電影的時(shí)長分布情況呢?
老規(guī)矩,上代碼:
''' ? ? 組數(shù)=極差/組距 ''' from matplotlib import pyplot as plt from matplotlib import font_manager import random ? a = [random.randint(80,140) for i in range(250)] print(a) print(max(a)-min(a)) ? # 計(jì)算組數(shù) d = 3 ?# 組距 num_bins = (max(a)-min(a))//d ? # 設(shè)置圖形大小 plt.figure(figsize=(20, 8), dpi=80) plt.hist(a, num_bins) ? # 設(shè)置x軸刻度 plt.xticks(range(min(a), max(a)+d, d)) ? # 設(shè)置網(wǎng)格 plt.grid(alpha=0.4) plt.show()
運(yùn)行結(jié)果如下圖:
程序分析:通過隨機(jī)數(shù)random.randint()生成250個(gè)80-140的隨機(jī)整數(shù),代表250部電影的時(shí)長。然后要把時(shí)間段分成組,設(shè)置組距d為3,那么(max-min)//d即為分成的組數(shù),然后通過plt.hist()對(duì)組數(shù)和數(shù)據(jù)進(jìn)行擬合。設(shè)置x刻度時(shí),因?yàn)閞ange含頭不含尾,所以最后截止的位置要加一個(gè)組距d,才能顯示完全。可以看出,這個(gè)數(shù)字直方圖可以顯示每個(gè)電影時(shí)長在每個(gè)時(shí)段占得數(shù)目。那么問題又來了,如果想要知道在每個(gè)時(shí)段占總時(shí)段的比例呢,也就是頻率分布直方圖?
so easy! 只需要在plt.hist()里面設(shè)置參數(shù)density=True實(shí)現(xiàn)數(shù)量的頻率化,其余不變。
代碼如下:
''' ? ? 組數(shù)=極差/組距 ''' from matplotlib import pyplot as plt from matplotlib import font_manager import random ? a = [random.randint(80,140) for i in range(250)] print(a) print(max(a)-min(a)) ? # 計(jì)算組數(shù) d = 3 ?# 組數(shù) num_bins = (max(a)-min(a))//d ? # 設(shè)置圖形大小 plt.figure(figsize=(20,8),dpi=80) plt.hist(a,num_bins,density=True) ?# 使用density實(shí)現(xiàn)頻率化 ? # 設(shè)置x軸刻度 plt.xticks(range(min(a),max(a)+d,d)) ? # 設(shè)置網(wǎng)格 plt.grid(alpha=0.4) plt.show()
運(yùn)行結(jié)果:
顯而易見,每個(gè)時(shí)段的數(shù)目變成了總體的占比,也就是頻率,很好的達(dá)到了想要的效果。
那如果要自己設(shè)置數(shù)據(jù)自己設(shè)置x軸的距離,對(duì)x軸的刻度不均勻劃分呢?
上代碼:
# coding=utf-8 from matplotlib import pyplot as plt from matplotlib import font_manager ? interval = [0,5,10,15,20,25,30,35,40,45,60,90,150] width = [5,5,5,5,5,5,5,5,5,15,30,60] quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47] ? plt.figure(figsize=(20,8),dpi=80) ? plt.bar(range(len(quantity)),quantity,width=1) ? # 設(shè)置x軸刻度 _x = [i-0.5 for i in range(13)] ? plt.xticks(_x, interval) ? plt.grid(alpha=0.8) plt.show()
運(yùn)行結(jié)果如下圖:
可以看出來,很簡單,只需要把x軸對(duì)應(yīng)的數(shù)據(jù)設(shè)置好,把對(duì)應(yīng)x軸的刻度設(shè)置好,進(jìn)行數(shù)據(jù)匹配即可。一定要注意,分配的組數(shù)和數(shù)據(jù)個(gè)數(shù)匹配問題。
總結(jié):這篇文章總的講述了一下繪制頻數(shù)直方圖和頻率直方圖的繪制方法,通過圖像進(jìn)行比較,發(fā)現(xiàn)各個(gè)直方圖的優(yōu)缺點(diǎn),以便在工程中進(jìn)行運(yùn)用。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python中matplotlib實(shí)現(xiàn)隨鼠標(biāo)滑動(dòng)自動(dòng)標(biāo)注代碼
這篇文章主要介紹了python中matplotlib實(shí)現(xiàn)隨鼠標(biāo)滑動(dòng)自動(dòng)標(biāo)注代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python使用指定端口進(jìn)行http請(qǐng)求的例子
今天小編就為大家分享一篇Python使用指定端口進(jìn)行http請(qǐng)求的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07python進(jìn)程池實(shí)現(xiàn)的多進(jìn)程文件夾copy器完整示例
這篇文章主要介紹了python進(jìn)程池實(shí)現(xiàn)的多進(jìn)程文件夾copy器,結(jié)合完整實(shí)例形式分析了Python基于多進(jìn)程與進(jìn)程池的文件操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-11-11Python多線程同步Lock、RLock、Semaphore、Event實(shí)例
這篇文章主要介紹了Python多線程同步Lock、RLock、Semaphore、Event實(shí)例,Lock & RLock 用來確保多線程多共享資源的訪問,Semaphore用來確保一定資源多線程訪問時(shí)的上限,Event是最簡單的線程間通信的方式,需要的朋友可以參考下2014-11-11python簡單實(shí)現(xiàn)基數(shù)排序算法
這篇文章主要介紹了python簡單實(shí)現(xiàn)基數(shù)排序算法,僅用4行代碼即可實(shí)現(xiàn)基數(shù)排序算法,非常簡單實(shí)用,需要的朋友可以參考下2015-05-05