繪製頻率分布直方圖的三種方法,總結的很用心!

2021-02-20 Python與算法社區

直方圖能幫助迅速了解數據的分布形態,將觀測數據分組,並以柱狀條表示各分組中觀測數據的個數。簡單而有效的可視化方法,可檢測數據是否有問題,也可看出數據是否遵從某種已知分布。

本次案例通過生成深圳市疫情個案數據集中所有患者的年齡參數直方圖。

分別使用Matplotlib、Pandas、Seaborn模塊可視化Histogram。

其中,Matplotlib和Pandas樣式簡單,看上去吸引力不大。Seaborn可往單變量直方圖上添加很多東西,更美觀,pandas可成組生成直方圖。

導入庫/數據

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import datetime
import time
df=pd.read_excel(r"szdata.xls")
df.head(5)

Matplotlib模塊

##注意原始數據集不能存在缺失值,繪製前必須對缺失數據刪除或替換,否則無法繪製成功.
##檢查年齡是否有缺失
any(df.年齡.isnull()) #False
##刪除含有缺失年齡的數據
df.dropna(subset=["年齡"],inplace=True)
##繪製直方圖
plt.rcParams["font.sans-serif"]='SimHei'
plt.rcParams['axes.unicode_minus']=False
%config InlineBackend.figure_format='svg'

plt.hist(x=df.年齡,bins=20,
        color="steelblue",
        edgecolor="black")

#添加x軸和y軸標籤
plt.xlabel("年齡")
plt.ylabel("病例數")

#添加標題
plt.title("患者年齡分布")

#顯示圖形
plt.show()

Pandas模塊

#注意直方圖上添加核密度圖,必須將直方圖頻數更改為頻率,即normed參數設置成True
#直方圖
df.年齡.plot(kind="hist",bins=20,color="steelblue",edgecolor="black",normed=True,label="直方圖")

#加核密度圖
df.年齡.plot(kind="kde",color="red",label="核密度圖")

#添加x軸和y軸標籤
plt.xlabel("年齡")
plt.ylabel("核密度值")

#添加標題
plt.title("患者年齡分布")

#顯示圖例
plt.legend()

#顯示圖形
plt.show()

# pandas.cut() 也同樣是一個方便的方法,用來將數據進行強制的分箱
# 將一系列數值分成若干份
#cut()方法,參數bin指明切分區間,左開右閉區間。
import numpy as np
from pandas import Series,DataFrame
ages=list(df.年齡)
bins=[0,29,39,49,50,np.inf]  #範圍
labels=["少年","青年組","中青年組","中年組","中老年組"]
groups=pd.cut(ages,bins=bins,labels=labels)
data=groups.value_counts()
#qcut()方法,不需要事先指明切分區間,只需要指明切分個數。
# pd.qcut(ages,6).value_counts()
df1=DataFrame(data,columns=["病例數"])

plt.subplot(1,1,1)
x=labels
y=df1["病例數"].values
plt.bar(x,y,width=0.5,align="center")
plt.title("深圳市患者按年齡分組",loc="center")
for a,b in zip(x,y):   
     plt.text(a,b,b,ha="center",va="bottom",fontsize=12)#添加數據標籤
plt.ylim(0,140)
plt.xlabel('分組',labelpad=10)
plt.ylabel('病例數')
plt.savefig(r"bar.jpg")

# 條形圖
# 將柱形圖x軸和y軸調換,barh方法
# plt.barh(y,width,height,align,color,edgecolor)

pandas也提供了一個方便的.value_counts() 方法,用來計算一個非空值的直方圖,並將之轉變成一個pandas的series結構:df.年齡.value_counts()

Seaborn模塊

# 上面表達了所有患者的年齡分布,如果按性別分組,
# 研究不同性別下年齡分布的差異,該如何實現叻?針對這個問題,推薦使用Seaborn模塊中的distplot函數
#取出男性年齡
Age_Male=df.年齡[df.性別=="男性"]
#取出女性年齡
Age_Female=df.年齡[df.性別=="女性"]

#繪製男女患者年齡的直方圖
sns.distplot(Age_Male,bins=20,kde=False,hist_kws={"color":"steelblue"},label="男性")

#繪製男女患者年齡的直方圖
sns.distplot(Age_Female,bins=20,kde=False,hist_kws={"color":"purple"},label="女性")
#添加標題
plt.title("不同性別患者年齡分布直方圖")

#顯示圖例
plt.legend()

#顯示圖形
plt.show()

#繪製核密度函圖
#繪製男女患者年齡的直方圖
sns.distplot(Age_Male,hist=False,kde_kws={"color":"red","linestyle":"-"},norm_hist=True,label="男性")

#繪製男女患者年齡的直方圖
sns.distplot(Age_Female,hist=False,kde_kws={"color":"blue","linestyle":"--"},norm_hist=True,label="女性")
#添加標題
plt.title("不同性別患者年齡核密度圖")

#顯示圖例
plt.legend()

#顯示圖形
plt.show()

Python實現histogram方法

#生成直方圖
# count_elements() 返回了一個字典,字典裡的鍵值對:所有數值出現的頻率次數。
# hist[i] = hist.get(i, 0) + 1 實現了每個數值次數的累積
a = tuple(df.年齡)
def count_elements(seq) -> dict:
    hist = {}
    for i in seq:
        hist[i] = hist.get(i, 0) + 1
    return hist
counted = count_elements(a)
counted
#或通過collection.Counter類庫實現
# from collections import Counter
# counted = Counter(a)
# counted

#利用輸出格式format來實現直方圖的展示
def histogram(seq) -> None:
    counted = count_elements(seq)
    for k in sorted(counted):
        print('{0:5d} {1}'.format(k, '@' * counted[k]))
histogram(a)

                   

Matplotlib模塊中hist函數

Plt.hist(x,bins=10,range=None,normed=False,weights=None,cumulative=False,bottom=None,histtype=』bar』,align=’mid』,orientation=』vertical』,rwidth=None,log=False,color=None,edgecolor=None,label=None,stacked=False)
1)、x:指定要繪製直方圖的數據。
2)、bins:指定直方圖條形的個數。
3)、range:指定直方圖數據的上下界,默認包含繪圖數據的最大值和最小值。
4)、normed:是否將直方圖的頻數轉換成頻率。
5)、weights:該參數可為每一個數據節點設置權重。
6)、cumulative:是否需要計算累積頻數或頻率。
7)、bottom:可以為直方圖的每個條形添加基準線,默認為0.
8)、histtype:指定直方圖的類型,默認bar,其他八日stacked、step和stepfilled。
9)、align:設置條形邊界的對齊方式,默認mid,另外left和right。
10)、orientation:設置直方圖的擺放方向,默認vertical垂直方向。
11)、rwidth:設置直方圖條形的寬度。
12)、log:是否需要對繪圖數據進行log變換。
13)、color:設置直方圖的填充色。
14)、edgecolor:設置直方圖邊框色。
15)、label:設置直方圖的標籤,可通過legend展示圖例。
16)、stacked:當有多個數據時,是否需要將直方圖呈堆疊擺放,默認水平擺放。

Seaborn模塊

Sns.distplot(x,bins=None,hist=True,kde=True,rug=False,fit=None,hist_kws=None,kde_kws=None,rug_kws=None,fit_kws=None,color=None,vertical=False,norm_hist=False,axlabel=None,label=None,ax=None)

1)、x:指定繪圖數據,可以是序列、一維數組或列表。
2)、bins:指定直方圖條形的個數。
3)、hist:bool類型的參數,是否繪製直方圖,默認True。
4)、kde:bool類型的參數,是否繪製核密度圖,默認True。
5)、rug:bool類型的參數,是否繪製須圖,(如果數據比較密集,該參數比較有用)默認False。
6)、fit:指定一個隨機分布對象,需調用scipy模塊中隨機分布函數,用於繪製隨機分布概率密度曲線。
7)、hist_kws:以字典形式傳遞直方圖的其他修飾屬性,如填充色、邊框色、寬度等。
8)、kde_kws:以字典形式傳遞核密度圖的其他修飾屬性,如線的顏色、線的類型等。

9)、rug_kws:以字典形式傳遞須圖的其他修飾屬性,如線的顏色、線的寬度等。
10)、fit_kws:以字典形式傳遞須圖的其他修飾屬性,如線的顏色、線的寬度等。
11)、color:指定圖顏色,除了隨機分布曲線的顏色。
12)、vertical:是否將圖形垂直顯示,默認True。
13)、norm_hist:是否將頻數更改為頻率,默認False。
14)、axlabel:用於顯示軸標籤。
15)、label:指定圖形圖例,需要結合plt.legend()一起使用。
16)、ax:指定子圖的位置。

Python新手成長之路案例集錦,長按關注:

相關焦點

  • 用Python為直方圖繪製擬合曲線的兩種方法
    ,用矩形的寬度和高度表示頻數分布,通過直方圖,用戶可以很直觀的看出數據分布的形狀、中心位置以及數據的離散程度等。在python中一般採用matplotlib庫的hist來繪製直方圖,至於如何給直方圖添加擬合曲線(密度函數曲線),一般來說有以下兩種方法。方法一:採用matplotlib中的mlab模塊mlab模塊是Python中強大的3D作圖工具,立體感效果極佳。
  • 【從零學習OpenCV 4】圖像直方圖繪製
    圖像直方圖簡單來說就是統計圖像中每個灰度值的個數,之後將圖像灰度值作為橫軸,以灰度值個數或者灰度值所佔比率作為縱軸繪製的統計圖。通過直方圖可以看出圖像中哪些灰度值數目較多,哪些較少,可以通過一定的方法將灰度值較為集中的區域映射到較為稀疏的區域,從而使得圖像在像素灰度值上分布更加符合期望狀態。
  • 5種方法教你用Python玩轉histogram直方圖
    本篇博主將要總結一下使用Python繪製直方圖的所有方法,大致可分為三大類(詳細劃分是五類,參照文末總結):下面,我們來逐一介紹每種方法的來龍去脈。當準備用純Python來繪製直方圖的時候,最簡單的想法就是將每個值出現的次數以報告形式展示。這種情況下,使用 字典 來完成這個任務是非常合適的,我們看看下面代碼是如何實現的。
  • 作圖——直方圖及分布曲線
    直方圖可以大致查看數據分布是否為正態。通常還需要將正態分布的曲線疊加在上面。
  • 從零開始學Python數據分析【13】-- matplotlib(直方圖)
    【6】-- pandas(數據框部分01)從零開始學Python數據分析【7】-- pandas(數據框部分02)從零開始學Python數據分析【8】-- pandas(數據框部分03)從零開始學Python數據分析【9】-- pandas(數據框部分04)從零開始學Python數據分析【10】-- matplotlib(條形圖)
  • Excel 2016直方圖使用指南
    圖/文 | 安偉星直方圖是用於展示數據分布情況的圖表,經常用於數據統計中。
  • 灰度直方圖
    算法:直方圖是圖像內灰度值的統計特性與圖像灰度值之間的函數,直方圖統計圖像內各個灰度級出現的次數,達到增強圖像顯示效果的目的。灰度直方圖只能反映圖像的灰度分布情況,而不能反映圖像像素的位置,丟失了像素的位置信息,不再表徵任何圖像的紋理信息。一幅圖像對應唯一的灰度直方圖,但是不同的圖像可對應相同的直方圖,一幅圖像分成多個區域,多個區域的直方圖之和即為原圖像的直方圖。由於同一物體無論是旋轉還是平移在圖像中都具有相同的灰度值,因此,直方圖具有平移不變性、放縮不變性等性質。
  • 第九單元 血液的一般檢驗 第七節 血細胞體積分布直方圖
    這些可以表示出細胞群體分布情況的圖形,稱為細胞體積分布直方圖。血細胞產生的脈衝高度與血細胞體積大小成正比,經A/D (模擬/數字)轉換後,脈衝數位化或轉換成與細胞大小相應的數字,數字被送到記憶線路,按體積大小儲存於體積通道中。血細胞分析儀根據血細胞的體積大小、出現的相對頻率,以坐標式的曲線圖表示出來,從而形成血細胞體積分布直方圖(又稱矩形圖或粒度分布曲線)。
  • 核密度圖的繪製
    我們用ggplot2繪製這6個數的核密度圖(兩種方法,代碼對應下圖的p1和p2)、直方圖和密度圖的組合比較(下圖p3),與其「鏡像翻轉」數列「相加」後新數列的密度圖(下圖p4,橙色)。=n,group=factor(m),color=factor(m),fill=factor(m)))> w1<-w+geom_density(adjust=0.55,alpha=0.6,size=1,colour="black")+xlim(-15,15)> p4# 將x這列數據乘以負1,從順序顛倒後與x相加,生成z,z和x組成數據框,繪製分組核密度圖
  • 可視化神器Plotly玩轉直方圖
    二、二、直方圖效果引用一段網上對直方圖的定義:直方圖(Histogram),又稱質量分布圖,是一種統計報告圖,由一系列高度不等的縱向條紋或線段表示數據分布的情況一般用橫軸表示數據類型,縱軸表示分布情況。 直方圖的兩個坐標分別是統計樣本和該樣本對應的某個屬性的度量,以長條圖(bar)的形式具體表現。看看本文中某個直方圖繪製的實際效果:
  • 探索直方圖
    通過以上論述,希望我們已經使你確信直方圖是一種對參數選擇非常敏感的圖形,繪製直方圖時使用可視化工具給你提供的默認參數絕對不是一個好主意。當你看到其他人製作的直方圖時,你應該會好奇它們的參數是如何選定的。有些時候,作者會特意挑選參數來展示數據中實際不存在的故事。
  • 【OpenCV入門之十一】如何實現直方圖均衡化
    圖像直方圖圖像直方圖,是指對整個圖像像在灰度範圍內的像素值(0~255)統計出現頻率次數,據此生成的直方圖,稱為圖像直方圖-直方圖。直方圖反映了圖像灰度的分布情況。是圖像的統計學特徵。直方圖均衡化:是一種提高圖像對比度的方法,拉伸圖像灰度值範圍。讓圖像更均衡。
  • 玩色弄彩:實例解析通道直方圖的使用技巧
    那麼通道直方圖是怎麼繪製的呢?如果明度直方圖最左端有像素,那麼畫面中就一定存在純黑色,也就是說必定有一個像素的R、G、B三個分量值都為0,這是由明度直方圖的計算方法決定的。光看這個直方圖似乎沒有發現多少特別的地方,直方圖最左端和最右端都有像素存在,整體曝光分布比較均勻,更多的分布在中間調和高光。
  • 教程 | 5種快速易用的Python Matplotlib數據可視化方法
    本文將介紹 5 種數據可視化方法,並用 Python 和 Matplotlib 寫一些快速易用的可視化函數。下圖展示了選擇正確可視化方法的導向圖。選擇正確可視化方法的導向圖。散點圖由於可以直接看到原始數據的分布,散點圖對於展示兩個變量之間的關係非常有用。
  • 5 種快速易用的 Python Matplotlib 數據可視化方法
    在下方公眾號後臺回覆:面試手冊,可獲取傑哥匯總的 3 份面試
  • 你知道直方圖都能幹啥?
    簡單總結如下, 詳見後文:直方圖定義維基百科上給出的定義是:在統計學中,直方圖(Histogram)是一種對數據分布情況的圖形表示, 是一種二維, 它的兩個坐標分別是統計樣本和該樣本對應的某個屬性的度量, 以長條圖(bar)的形式具體表現.
  • OpenCV中圖像直方圖與應用
    OpenCV中圖像直方圖與應用圖像直方圖數據在圖像處理中應用十分廣泛,根據直方圖數據不同常見的有如下三種:- 圖像像素直方圖、
  • 如何使用Excel製作直方圖?
    今天給大家聊一下直方圖。直方圖是數據分析常用圖表之一,通常橫軸表示數據分組,縱軸表示頻數,各組數據與相應的頻數形成矩形,矩形的寬度和高度表示頻數分布。通過直方圖,用戶可以很直觀的看出數據分布的形狀、中心位置以及數據的離散程度等。
  • reldist-相對分布:分布差異分析和檢驗
    水平時,實驗組人群的頻率與參照組人群頻率之比reldist 可用於估計並分析兩組或者兩個變量間的相對分布。具體而言,其可用來估計和繪製相對概率密度函數 (relative PDF) 或者相對累計分布函數 (relative CDF)。此外,該命令可計算相對極化指數以及相應數據的描述性統計,並且支持通過調整位置、規模、形狀或協變量分布差異對相對分布進行分解。
  • 5 種使用 Python 代碼輕鬆實現數據可視化的方法
    print數據可視化是數據科學家工作中的重要組成部分。在項目的早期階段,你通常會進行探索性數據分析(Exploratory Data Analysis,EDA)以獲取對數據的一些理解。創建可視化方法確實有助於使事情變得更加清晰易懂,特別是對於大型、高維數據集。在項目結束時,以清晰、簡潔和引人注目的方式展現最終結果是非常重要的,因為你的受眾往往是非技術型客戶,只有這樣他們才可以理解。