直方圖能幫助迅速了解數據的分布形態,將觀測數據分組,並以柱狀條表示各分組中觀測數據的個數。簡單而有效的可視化方法,可檢測數據是否有問題,也可看出數據是否遵從某種已知分布。
本次案例通過生成深圳市疫情個案數據集中所有患者的年齡參數直方圖。
分別使用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)
##注意原始數據集不能存在缺失值,繪製前必須對缺失數據刪除或替換,否則無法繪製成功.
##檢查年齡是否有缺失
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()
#注意直方圖上添加核密度圖,必須將直方圖頻數更改為頻率,即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:當有多個數據時,是否需要將直方圖呈堆疊擺放,默認水平擺放。
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新手成長之路案例集錦,長按關注: