数值型变量的可视化
一、直方图与核密度曲线
直方图一般用来观察数据的分布形态,横坐标代表数值的均匀分段,纵坐标代表每个段内的观测数量(频数)
按性别分组,研究不同性别下年龄分布的差异
通过seaborn模块中的distplot函数
import seaborn as sns
# 读入数据
Titanic = pd.read_csv(r'F:\titanic_train.csv')
Titanic.head()
以Titanic数据集为例
# 检查年龄是否有缺失
any(Titanic.Age.isnull())
# 不妨删除含有缺失年龄的观察
Titanic.dropna(subset=['Age'], inplace=True)
# 再检查年龄是否有缺失
any(Titanic.Age.isnull())
1.直方图和核密度图
# 取出男性年龄
Age_Male = Titanic.Age[Titanic.Sex == 'male']
# 取出女性年龄
Age_Female = Titanic.Age[Titanic.Sex == 'female']
# 绘制男女乘客年龄的直方图
sns.distplot(Age_Male, bins = 20, kde = True, hist_kws = {'color':'steelblue'}, label = '男性')
# 绘制女性年龄的直方图
sns.distplot(Age_Female, bins = 20, kde = True, hist_kws = {'color':'purple'}, label = '女性')
plt.title('男女乘客的年龄直方图')
# 显示图例
plt.legend()
# 显示图形
plt.show()
2.直方图
# 取出男性年龄
Age_Male = Titanic.Age[Titanic.Sex == 'male']
# 取出女性年龄
Age_Female = Titanic.Age[Titanic.Sex == 'female']
# 绘制男女乘客年龄的直方图
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()
从直方图来看,女性年龄的分布明显比男性矮,说明在各年龄段下,男性乘客要比女性乘客多
3.核密度图
# 绘制男女乘客年龄的核密度图
sns.distplot(Age_Male, hist = False, kde_kws = {'color':'red', 'linestyle':'-'},
norm_hist = True, label = '男性')
# 绘制女性年龄的核密度图
sns.distplot(Age_Female, hist = False, kde_kws = {'color':'black', 'linestyle':'--'},
norm_hist = True, label = '女性')
plt.title('男女乘客的年龄核密度图')
# 显示图例
plt.legend()
# 显示图形
plt.show()
从核密度图可以看出,男女性别的年龄分布趋势比较接近,说明在各年龄段下的男女乘客人数同步增加或减少。
二、箱线图
箱线图也可以体现数据分布,还可以发现数据中的异常点
一般绘制分组箱线图,即二手房单价按照分组变量(例如行政区域、楼层、朝向等)进行对比分析
通过seaborn模块中的boxplot函数
# 读取数据
Sec_Buildings = pd.read_excel(r'F:\sec_buildings.xlsx')
Sec_Buildings.head()
以某平台二手房单价数据为例
# 二手房在各行政区域的平均单价
group_region = Sec_Buildings.groupby('region')
avg_price = group_region.aggregate({'price_unit':np.mean}).sort_values('price_unit', ascending = False)
# 绘制分组箱线图
sns.boxplot(x = 'region', y = 'price_unit', data = Sec_Buildings,
order = avg_price.index, showmeans=True,color = 'steelblue',
flierprops = {'marker':'o','markerfacecolor':'red', 'markersize':3},
meanprops = {'marker':'D','markerfacecolor':'indianred', 'markersize':4},
medianprops = {'linestyle':'--','color':'orange'}
)
# 更改x轴和y轴标签
plt.xlabel('')
plt.ylabel('单价(元)')
# 添加标题
plt.title('不同行政区域的二手房单价对比')
# 显示图形
plt.show()
order表示按照平均价格降序排列,fileprops设置异常点的属性,meanprops设置均值的属性,medianprops设置中位数的属性
图中上下两条横线代表上下须、箱体的上下两条横线代表上下四分位数、箱体中的虚线代表中位线、箱体中的点则为均值、上下须两端的点代表异常值
三、小提琴图
将数值型数据的核密度图和箱线图融合在一起,进而形成小提琴图
通过seaborn模块中的violinplot函数
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
# 读入数据
tips = pd.read_csv(r'F:\tips.csv')
tips.head()
以酒吧的消费数据为例
# 设置绘图风格(不妨使用R语言中的ggplot2风格)
plt.style.use('ggplot')
# 绘制分组小提琴图
sns.violinplot(x = "day", # 指定x轴的数据
y = "total_bill", # 指定y轴的数据
hue = "sex", # 指定分组变量
data = tips, # 指定绘图的数据集
order = ['Thur','Fri','Sat','Sun'], # 指定x轴刻度标签的顺序
scale = 'count', # 以男女客户数调节小提琴图左右的宽度
split = True, # 将小提琴图从中间割裂开,形成不同的密度曲线;
palette = 'RdBu' # 指定不同性别对应的颜色(因为hue参数为设置为性别变量)
)
# 添加图形标题
plt.title('每天不同性别客户的消费额情况')
# 设置图例
plt.legend(loc = 'upper center', ncol = 2)
# 显示图形
plt.show()
scale:用于调整小提琴图左右的宽度,如果为area,则表示每个小提琴图左右部分拥有相同的面积;如果为count,则表示根据样本数量来调节宽度;如果为width,则表示每个小提琴图左右两部分拥有相同的宽度
每个小提琴左右两边代表了不同性别客户的消费额分布。
以周五周六为例,周五的男女客户数量差异不大,而周六男性客户比女性客户多,因为右半边的核密度图更宽一些。
四、折线图
一般用于拟合时间序列数据
通过matplotlib模块中的plot函数
import matplotlib.pyplot as plt
# 读入数据
wechat = pd.read_excel(r'F:\wechat.xlsx')
wechat.head()
以某微信公众号的阅读人数和阅读人次为例
1. 绘制单条折线图
# 绘制单条折线图
plt.plot(wechat.Date, # x轴数据
wechat.Counts, # y轴数据
linestyle = '-', # 折线类型
linewidth = 2, # 折线宽度
color = 'steelblue', # 折线颜色
marker = 'o', # 折线图中添加圆点
markersize = 6, # 点的大小
markeredgecolor='black', # 点的边框色
markerfacecolor='brown') # 点的填充色
# 添加y轴标签
plt.ylabel('人数')
# 添加图形标题
plt.title('每天微信文章阅读人数趋势')
# 显示图形
plt.show()
折线类型:
-(一个减号) 实心线
--(两个减号) 虚线
-.(减句号) 虚线和点构成的线
:(英文冒号) 点构成的线
点的类型:
.(英文句号) 实心点
o(小写字母) 空心点
2,绘制两条折线图
如何将阅读人数和人次同时呈现在图中?
对于x轴的刻度标签,是否可以只保留月份和日期,并且以7天作为间隔?
# 绘制两条折线图
# 导入模块,用于日期刻度的修改
import matplotlib as mpl
# 绘制阅读人数折线图
plt.plot(wechat.Date, # x轴数据
wechat.Counts, # y轴数据
linestyle = '-', # 折线类型,实心线
color = 'steelblue', # 折线颜色
label = '阅读人数'
)
# 绘制阅读人次折线图
plt.plot(wechat.Date, # x轴数据
wechat.Times, # y轴数据
linestyle = '--', # 折线类型,虚线
color = 'indianred', # 折线颜色
label = '阅读人次'
)
# 获取图的坐标信息
ax = plt.gca()
# 设置日期的显示格式
date_format = mpl.dates.DateFormatter("%m-%d")
ax.xaxis.set_major_formatter(date_format)
# 设置x轴显示多少个日期刻度
# xlocator = mpl.ticker.LinearLocator(10)
# 设置x轴每个刻度的间隔天数
xlocator = mpl.ticker.MultipleLocator(7)
ax.xaxis.set_major_locator(xlocator)
# 为了避免x轴刻度标签的紧凑,将刻度标签旋转45度
plt.xticks(rotation=45)
# 添加y轴标签
plt.ylabel('人数')
# 添加图形标题
plt.title('每天微信文章阅读人数与人次趋势')
# 添加图例
plt.legend()
# 显示图形
plt.show()
plt.show自动将两条折线呈现在一张图中
通过ax获取原始状态的轴属性后,基于ax对象修改刻度的显示方式