前文回看:
【Python菜鸟进阶大神】Matplotlib数据可视化001:基础API汇总&散点图
【Python菜鸟进阶大神】Matplotlib数据可视化002:折线图
【Python菜鸟进阶大神】Matplotlib数据可视化003:条形图
【Python菜鸟进阶大神】Matplotlib数据可视化004:饼图
直方图用来描述连续变量(定量变量)的分布情况,横轴表示数据类型,纵轴表示分布情况
直方图的API:
hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype=’bar’, align=’mid’, orientation=’vertical’, rwidth=None, log=False, color=None, label=None, stacked=False)
x:指定要绘制直方图的数据;
bins:指定直方图条形的个数;
range:指定直方图数据的上下界,默认包含绘图数据的最大值和最小值;
normed:是否将直方图的频数转换成频率;
weights:该参数可为每一个数据点设置权重;
cumulative:是否需要计算累计频数或频率;
bottom:可以为直方图的每个条形添加基准线,默认为0;
histtype:指定直方图的类型,默认为bar,除此还有’barstacked’,‘step’, ‘stepfilled’;
align:设置条形边界值的对其方式,默认为mid,除此还有’left’和’right’;
orientation:设置直方图的摆放方向,默认为垂直方向;
rwidth:设置直方图条形宽度的百分比;
log:是否需要对绘图数据进行log变换;
color:设置直方图的填充色;
label:设置直方图的标签,可通过legend展示其图例;
stacked:当有多个数据时,是否需要将直方图呈堆叠摆放,默认水平摆放;
首先,我们加载数据:
数据来源:https://pan.baidu.com/s/1lEV_mMQZVPCrShH9ku_TYw(d6gr)
# 引入模块
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
# 中文乱码和坐标轴负号的处理
plt.rcParams[‘font.sans-serif’] = [‘Microsoft YaHei’]
plt.rcParams[‘axes.unicode_minus’] = False
# 加载数据
path=”C:/Users/Administrator/Desktop/exercise_data/train.csv”
df=pd.read_csv(path)
df.head()
df[“Age”].isnull() #检查age变量是否含有缺失值
df.dropna(subset=[“Age”],inplace=True) # 删除掉age列含有缺失值对应的所有行
plt.hist(df[“Age”], #绘图数据
bins=20, #多少个条
color=”blue”, #颜色
label=”年龄”, #标签,用以图例legend
histtype=”bar”, #直方图的样式
normed =False, #频数
edgecolor = ‘white’ # 指定直方图条形的边界色
)
plt.title(“泰坦尼克号乘客年龄分布”,fontdict={‘fontsize’:18, ‘color’:’r’})
plt.xlabel(“Age”)
plt.ylabel(“频数”)
# 显示图例
plt.legend(loc = ‘best’)
# 显示图形
plt.show()
plt.hist(df[“Age”], #绘图数据
bins=np.arange(df.Age.min(),df[“Age”].max(),5), #从age的最小值到最大值,步长为5
color=”blue”, #颜色
label=”年龄”, #标签,用以图例legend
histtype=”bar”, #直方图的样式
normed =True, #频数变为频率
edgecolor = ‘white’ # 指定直方图条形的边界色
)
plt.title(“泰坦尼克号乘客年龄分布”,fontdict={‘fontsize’:18, ‘color’:’r’})
plt.xlabel(“Age”)
plt.ylabel(“频率”)
# 显示图例
plt.legend(loc = ‘best’)
# 显示图形
plt.show()
参数cumulative = True, 则是积累直方图,上图右所示。
import matplotlib.mlab as mlab
from scipy.stats import norm
plt.hist(df[“Age”], #绘图数据
bins=np.arange(df.Age.min(),df[“Age”].max(),5), #多少个条
color=”blue”, #颜色
label=”年龄”, #标签,用以图例legend
histtype=”bar”, #直方图的样式
normed =True, #频数变为频率
edgecolor = ‘white’ # 指定直方图条形的边界色
)
plt.title(“泰坦尼克号乘客年龄分布”,fontdict={‘fontsize’:18, ‘color’:’r’})
plt.xlabel(“Age”)
plt.ylabel(“频率”)
# 生成正态曲线的数据
x1 = np.linspace(df.Age.min(), df.Age.max(), 1000)
normal = norm.pdf(x1, df.Age.mean(), df.Age.std())
# 绘制正态分布曲线
line1,= plt.plot(x1,normal,’r-‘, linewidth = 2)
# 生成核密度曲线的数据
kde = mlab.GaussianKDE(df.Age)
x2 = np.linspace(df.Age.min(), df.Age.max(), 1000)
# 绘制
line2, = plt.plot(x2,kde(x2),’k-.’, linewidth = 2)
# 显示图例
plt.legend([line1,line2],[“正态分布曲线”,”核密度曲线”],loc=”best”)
注意:
都知道x服从~N(μ,σ^2),就是正态分布;μ=1,σ^2=0,是标准正态分布。
生成正态概率密度:
y1=mlab.normpdf(x,mu均值,sigma标准差),或者
y2=norm.pdf(x,mu均值,sigma标准差)
两个变量的直方图
在年龄的基础上,将男性和女性区分出来
# 提取不同性别的年龄数据
age_female = df.Age[df.Sex == ‘female’]
age_male = df.Age[df.Sex == ‘male’]
# 设置直方图的组距
bins = np.arange(df.Age.min(), df.Age.max(), 3)
# 男性乘客年龄直方图
plt.hist(age_male, bins = bins, label = ‘男性’, color = ‘blue’, alpha =1)
# 女性乘客年龄直方图
plt.hist(age_female, bins = bins, label = ‘女性’, color = ‘y’,alpha = 0.8)
# 设置坐标轴标签和标题
plt.title(‘泰坦尼克号乘客年龄-按性别分布’,fontdict={‘fontsize’:18, ‘color’:’r’})
plt.xlabel(‘年龄’,fontdict={‘fontsize’:18, ‘color’:’k’})
plt.ylabel(‘人数’,fontdict={‘fontsize’:18, ‘color’:’k’})
# 显示图例
plt.legend()
# 显示图形
plt.show()
上图显示的总体还是年龄的分布,男女年龄的均值和标准差没有太大的差异,所以两个图是重叠在一起的。
都知道,均值反映集中趋势,体现总体的情况中大部分的量是多少。
标准差反映离散程度,方差的开平方,反映每个样本和总体均数的差异,方差越大越离散,也就是正态曲线峰越低。
在用一组数据和图形体现:
# 构造数据
mu1,sigma1=80,30
mu2,sigma2=30,15
x1=mu1+sigma1*np.random.randn(10000)
x2=mu2+sigma2*np.random.randn(10000)
# 画图
plt.hist(x1,bins=50,density=True,color=”r”,alpha=1)
plt.hist(x2,bins=50,density=True,color=”b”,alpha=0.7)
# 加数据标签
plt.text(90,0.013,r”$\mu=80,\ \sigma=30$”,fontdict={‘fontsize’:13,’color’:’r’,’weight’:’bold’,’family’:’serif’})
plt.text(35,0.025,r”$\mu=30,\ \sigma=15$”,fontdict={‘fontsize’:13,’color’:’k’})
# 设置x轴的范围
plt.xlim(-15,170)
# 标题
plt.title(“均值和标准差不同的直方图比较”,fontdict={‘fontsize’:20,’color’:’k’})
原文链接https://mp.weixin.qq.com/s/qmmNu78mQuGKRzWmwPF8kw
https://www.jianshu.com/p/da32f50958e7