直方圖
直方圖是一個可以快速展示數據概率分布的工具,直觀易于理解,并深受數據愛好者的喜愛。大家平時可能見到最多就是 matplotlib,seaborn 等高級封裝的庫包,類似以下這樣的繪圖。
本篇博主將要總結一下使用Python繪制直方圖的所有方法,大致可分為三大類(詳細劃分是五類,參照文末總結):
純Python實現直方圖,不使用任何第三方庫 使用Numpy來創建直方圖總結數據 使用matplotlib,pandas,seaborn繪制直方圖下面,我們來逐一介紹每種方法的來龍去脈。
純Python實現histogram
當準備用純Python來繪制直方圖的時候,最簡單的想法就是將每個值出現的次數以報告形式展示。這種情況下,使用 字典 來完成這個任務是非常合適的,我們看看下面代碼是如何實現的。
>>> a = (0, 1, 1, 1, 2, 3, 7, 7, 23)>>> def count_elements(seq) -> dict:... """Tally elements from `seq`."""... hist = {}... for i in seq:... hist[i] = hist.get(i, 0) + 1... return hist>>> counted = count_elements(a)>>> counted{0: 1, 1: 3, 2: 1, 3: 1, 7: 2, 23: 1}
我們看到,count_elements()
返回了一個字典,字典里出現的鍵為目標列表里面的所有唯一數值,而值為所有數值出現的頻率次數。hist[i] = hist.get(i, 0) + 1
實現了每個數值次數的累積,每次加一。
實際上,這個功能可以用一個Python的標準庫 collection.Counter
類來完成,它兼容Pyhont 字典并覆蓋了字典的 .update()
方法。
>>> from collections import Counter>>> recounted = Counter(a)>>> recountedCounter({0: 1, 1: 3, 3: 1, 2: 1, 7: 2, 23: 1})
可以看到這個方法和前面我們自己實現的方法結果是一樣的,我們也可以通過 collection.Counter
來檢驗兩種方法得到的結果是否相等。
>>> recounted.items() == counted.items()True
我們利用上面的函數重新再造一個輪子 ASCII_histogram,并最終通過Python的輸出格式format來實現直方圖的展示,代碼如下:
def ascii_histogram(seq) -> None: """A horizontal frequency-table/histogram plot.""" counted = count_elements(seq) for k in sorted(counted): print('{0:5d} {1}'.format(k, '+' * counted[k]))
這個函數按照數值大小順序進行繪圖,數值出現次數用 (+) 符號表示。在字典上調用 sorted()
將會返回一個按鍵順序排列的列表,然后就可以獲取相應的次數 counted[k]
。
>>> import random>>> random.seed(1)>>> vals = [1, 3, 4, 6, 8, 9, 10]>>> # `vals` 里面的數字將會出現5到15次>>> freq = (random.randint(5, 15) for _ in vals)>>> data = []>>> for f, v in zip(freq, vals):... data.extend([v] * f)>>> ascii_histogram(data) 1 +++++++ 3 ++++++++++++++ 4 ++++++ 6 +++++++++ 8 ++++++ 9 ++++++++++++ 10 ++++++++++++
新聞熱點
疑難解答