直方圖用於展示數據的分布情況,x軸是一個連續變量,y軸是該變量在一定區間內的頻次。
下面利用Nathan Yau所著的《鮮活的數據:數據可視化指南》一書中的數據,學習畫圖。
數據地址:http://datasets.flowingdata.com/crimeRatesByState2005.csv
以下是這個數據文件的前5行:
state murder forcible_rape robbery aggravated_assault \ 0 United States 5.6 31.7 140.7 291.1 1 Alabama 8.2 34.3 141.4 247.8 2 Alaska 4.8 81.1 80.9 465.1 3 Arizona 7.5 33.8 144.4 327.4 4 Arkansas 6.7 42.9 91.1 386.8 burglary larceny_theft motor_vehicle_theft population 0 726.7 2286.3 416.7 295753151 1 953.8 2650.0 288.3 4545049 2 622.5 2599.1 391.0 669488 3 948.4 2965.2 924.4 5974834 4 1084.6 2711.2 262.1 2776221
這是美國各州各種犯罪行為的發生率(每10萬人口)。
我們把robbery和aggravated_assault的犯罪率分別分成12個區間,每個區間的犯罪率各為60次。讓我們看看各區間出現的次數。(也就是0-60這一犯罪率區間出現幾次,61-120出現幾次等等)
直方圖: ax.hist(x,bins=num_of_bins) --- x為變量,bins為柱子數量
代碼如下:
import numpy as np import pandas as pd from matplotlib import pyplot as plt crime=pd.read_csv(r"http://datasets.flowingdata.com/crimeRatesByState2005.csv") fig,ax=plt.subplots() ax.hist(crime["robbery"],bins=12,histtype="stepfilled",alpha=0.6,label="robbery") ax.hist(crime["aggravated_assault"],bins=12,histtype="stepfilled",alpha=0.6,label="aggravated_assault") ax.legend() ax.set_xticks(np.arange(0,721,60)) ax.set_xlim(0,720) ax.set_yticks(np.arange(0,21,4)) plt.show()
圖像如下:
可以看出,robbery在60-120犯罪率這一區間出現次數最多,而aggravated_assault在120-180犯罪率這一區間出現次數最多。
此外,直方圖也可以被歸一化以顯示“相對”頻率,在命令里加上參數normed=True即可。這樣,y軸就變成了相對頻率(頻率=頻次/樣本總數;相對頻率=頻率/組距)。
顯示相對頻率的圖像如下:
下面我們自己創建一組符合正態分布的數據,再用matplotlib畫畫看。
import numpy as np from matplotlib import pyplot as plt fig,ax=plt.subplots() np.random.seed(4) #設置隨機數種子 Gaussian=np.random.normal(0,1,1000) #創建一組平均數為0,標准差為1,總個數為1000的符合標准正態分布的數據 ax.hist(Gaussian,bins=25,histtype="stepfilled",normed=True,alpha=0.6) plt.show()
圖像如下:
此時,圖像反映的是其概率密度,直方圖的面積總和為1。
除了頻次直方圖,我們還可以用KDE(kernel density estimation)獲取變量分布的平滑估計。具體請見下一篇:Matplotlib學習---用seaborn畫直方圖/核密度圖(histogram, kdeplot)。