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


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM