1. 程式人生 > >Matplotlib學習---用matplotlib畫直方圖/密度圖(histogram, density plot)

Matplotlib學習---用matplotlib畫直方圖/密度圖(histogram, density plot)

hist true ble 次數 出現的次數 ron 我們 9.1 獲取

直方圖用於展示數據的分布情況,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 & KDE)

Matplotlib學習---用matplotlib畫直方圖/密度圖(histogram, density plot)