学习目标
数据可视化是指直观展现数据,它是数据处理过程的一部分。
把数值绘制出来更方便比较。借助数据可视化,能更直观地理解数据,这是直接查看数据表做不到的
数据可视化有助于揭示数据中隐藏的模式,数据分析时可以利用这些模式选择模型
1)Matplotlib(功能强大,代码相对复杂)
2)Pandas (使用简单,功能稍弱)
3)Seaborn (推荐使用)
4)echarts 和 pyecharts (追求可视化效果,推荐使用)
统计图能够简洁、直观地对主要的数据信息进行呈现,反映事物内在的规律和关联。当然难免会丢失数据的细节,鱼与熊掌不可兼得。
根据统计图呈现变量的数量将其分为单变量图、双变量图、多变量图,然后再根据测试尺度进行细分。变量主要分为3类:无序、有序和连续型变量。
单变量其实就是通常我们所说的数据集中的一列数据。
单变量图:观察一个变量的数据分布情况。
双变量图:观察两个变量(自变量和因变量)之间的联系。
因变量为连续型
因变量为分类型
多变量图(3变量图):观察多个变量之间的联系
此处仅介绍 3 变量图,切勿将统计图做得太复杂,不然将失去统计图
直观明了
的优点
基本概念:
基本绘图:
使用 Matplotlib 绘图,首先需要导入 pyplot 模块,该模块包含一系列绘图函数的相关函数
import matplotlib.pyplot as plt
Matplotlib提供了两种方法来作图:状态接口和面向对象
1)状态接口
# 准备数据
x = [-3, 5, 7]
y = [10, 2, 5]
# 绘制折线图
plt.plot(x, y)
# 设置 x 轴、y 轴刻度
plt.xlim(-3, 8)
plt.ylim(2, 10)
# 设置 x 轴、y 轴标题
plt.xlabel('X Axis', size=20)
plt.ylabel('Y Axis', size=20)
# 设置图形标题
plt.title('Line Plot', size=30)
# 显示图形
plt.show()
2)面向对象
# 准备数据
x = [-3, 5, 7]
y = [10, 2, 5]
# 创建图(画布)
fig = plt.figure(figsize=(6.4, 4.8))
# 在图(画布)上添加坐标系
axes = fig.subplots(1, 1)
# 在坐标系上进行绘图
axes.plot(x, y)
# 设置坐标系 x 轴、y 轴刻度
axes.set_xlim(-3, 8)
axes.set_ylim(0, 10)
# 设置坐标系 x 轴、y轴标题
axes.set_xlabel('X Axis', fontsize=20)
axes.set_ylabel('Y Axis', fontsize=20)
# 设置坐标系标题
axes.set_title('Line Plot', fontsize=30)
# 显示图形
plt.show()
本小节使用 seaborn 库的 tips 数据集,其中包含了某餐厅服务员收集的顾客付小费的相关数据
加载 tips
数据集类
tips = sns.load_dataset('tips')
tips.head()
(1)直方图
查看客户消费金额 total_bill 的分布情况
# 创建图和坐标系
fig = plt.figure()
axes = fig.subplots(1, 1)
# bins=10:表示把数据分成几组,即将数据划分按顺序为几个区间
axes.hist(tips['total_bill'], bins=10)
# 显示图形
plt.show()
注意:直方图的柱子宽度表示该组数据的区间。
(2)箱线图:
fig = plt.figure()
axes = fig.subplots(1, 1)
# 箱线图
axes.boxplot(tips['total_bill'])
# 显示图形
plt.show()
箱线图补充:
(3)条形图:
按照 day(周几) 统计每天的消费数量
# 按照 day(周几) 统计每天的消费数量
result = tips['day'].value_counts()
fig = plt.figure()
axes = fig.subplots(1, 1)
# axes.bar(x, y):指定x轴和y轴数据
axes.bar(result.index, result.values)
饼图:
fig = plt.figure()
axes = fig.subplots(1, 1)
# pie:饼图
axes.pie(day_counts.values, labels=day_counts.index, autopct='%.1f%%')
(1)散点图
查看消费数据中消费tip随着消费金额total_bill的变化情况
fig = plt.figure()
axes = fig.subplots(1, 1)
# axes.scatter(x, y):散点图,指定x轴和y轴的数据
axes.scatter(tips['total_bill'], tips['tip'])
(2)蜂巢图:
fig = plt.figure()
axes = fig.subplots(1, 1)
# axes.hexbin(x, y):蜂巢图,指定x轴和y轴的数据
# gridsize=10:指定x轴方向上每一横行分几个格子
hb = axes.hexbin(tips['total_bill'], tips['tip'], gridsize=10)
# 添加图形右侧的颜色提示栏
fig.colorbar(hb, ax=axes)
(3)条形图:
按 day(周几) 统计每餐消费的平均值并进行可视化
# 按 day(周几) 统计每餐消费的平均值
result = tips.groupby('day').total_bill.mean()
fig = plt.figure()
axes = fig.subplots(1, 1)
# axes.bar(x, y):条形图,指定x轴和y轴的数据
axes.bar(result.index, result.values)
(4)折线图:
# 创建一个有序的分类数据类型
from pandas.api.types import CategoricalDtype
cat = CategoricalDtype(categories=['Thur', 'Fri', 'Sat', 'Sun'], ordered=True)
# 将 day 这列数据转换为有序分类数据类型
tips['day'] = tips['day'].astype(cat)
# 按 day(周几) 统计每餐消费的平均值
result = tips.groupby('day').total_bill.mean()
fig = plt.figure()
axes = fig.subplots(1, 1)
# axes.plot(x, y):折线图,指定x轴和y轴的数据
axes.plot(result.index, result.values)
3) 多变量绘图
(1)散点图:
查看不同性别的消费客户中,消费tip随着消费金额total_bill的变化情况
def recode_sex(sex):
if sex == 'Female':
return 0
else:
return 1
tips['sex_color'] = tips['sex'].apply(recode_sex)
tips
# 创建图和坐标系
fig = plt.figure()
axes = fig.subplots(1, 1)
# 散点图
# c:设置根据哪列数据将散点图分类,使用不同的颜色表示
scatter = axes.scatter(tips['total_bill'], tips['tip'],
c=tips['sex_color'], s=tips['size'] * 10, alpha=0.5)
# 添加图例
legend = axes.legend(*scatter.legend_elements(), title='gender')
axes.add_artist(legend)
# 显示图形
plt.show()
学习目标
pandas库是Python数据分析的核心库
1)它不仅可以加载和转换数据,还可以做更多的事情:它还可以可视化
2)DataFrame 对象或 Series 对象直接调用plot()
函数即可绘图
plot 默认为折线图,折线图也是最常用和最基础的可视化图形,足以满足我们日常 80% 的需求:
df.plot()
s.plot()
我们可以在 plot 后增加调用来使用其他的图形,当然这些图形对数据结构也有自己的要求,教程后边会逐个介绍:
df.plot.line() # 折线图的全写方式
df.plot.bar() # 条形图(柱状图)
df.plot.barh() # 条形图(横向柱状图)
df.plot.hist() # 直方图
df.plot.box() # 箱形图
df.plot.kde() # 核密度估计图
df.plot.density() # 同 df.plot.kde()
df.plot.area() # 面积图
df.plot.pie() # 饼图
df.plot.scatter() # 散点图
df.plot.hexbin() # 六边形箱体图,或简称六边形图
Pandas 处理的结果可视化,建议直接用 Seaborn 绘图,具体 Pandas 的可视化可以参考如下文档学习:
pandas plot 绘图 | pandas 教程 - 盖若
seaborn 是基于 matplotlib 的图形可视化 python 包。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。
1)seaborn 是在 matplotlib 的基础上进行了更高级的 API 封装,从而使得作图更加容易,在大多数情况下使用seaborn 能做出很具有吸引力的图,而使用 matplotlib 就能制作具有更多特色的图
2)seaborn和 pandas 的 API 配合的很好,使用 DataFrame/Series 的数据就可以绘图
加载 tips
数据集类
tips = sns.load_dataset('tips')
tips
(1)直方图 vs 密度图
查看客户消费金额 total_bill 的分布情况
# 绘制直方图
sns.histplot(tips, x='total_bill')
# 绘制密度图
sns.kdeplot(tips['total_bill'])
# 绘制直方图+密度曲线
sns.histplot(tips, x='total_bill', bins=10, kde=True)
(2)箱线图:
# 绘制箱线图
sns.boxplot(y='total_bill', data=tips)
(3)小提琴图:
# 绘制小提琴图
sns.violinplot(y='total_bill', data=tips)
(4)条形图:
按照 day(周几) 统计每天的消费数量
# 按照 day(周几) 统计每天的消费数量
result = tips['day'].value_counts()
# 绘制条形图
sns.barplot(x=result.index, y=result.values)
# 绘制条形图(计数图)
sns.countplot(x='day', data=tips)
(5)饼图:
注:seaborn 没有提供绘制饼图的方法,可以使用 matplotlib 或 pandas 的方法绘制饼图。
(1)散点图
查看消费数据中消费tip随着消费金额total_bill的变化情况
# 绘制散点图
sns.scatterplot(x='total_bill', y='tip', data=tips)
(2)蜂巢图:
# 绘制蜂巢图
sns.jointplot(x='total_bill', y='tip', data=tips, kind='hex')
(3)条形图:
按 day(周几) 统计每餐消费的平均值并绘图
# 按 day(周几) 统计每餐消费的平均值
result = tips.groupby('day').total_bill.mean()
# 绘制条形图
sns.barplot(x=result.index, y=result.values)
# 绘制条形图
sns.barplot(x='day', y='total_bill', data=tips)
(4)折线图:
# 按 day(周几) 统计每餐消费的平均值
result = tips.groupby('day').total_bill.mean()
# 绘制折线图
sns.lineplot(x=result.index, y=result.values)
# 绘制折线图
sns.lineplot(x='day', y='total_bill', data=tips)
(1)散点图:
查看不同性别的消费客户中,消费 tip 随着消费金额 total_bill 的变化情况
# 绘制散点图,同时 hue 指定列对绘制的点进行分类,用不同的颜色表示
sns.scatterplot(x='total_bill', y='tip', data=tips, hue='sex')
查看不同性别的消费客户中,消费金额 total_bill 随着 day 的变化情况
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8, 7))
axes = fig.subplots(1, 1)
# 绘制折线图
sns.lineplot(x='day', y='total_bill', data=tips, hue='sex', ax=axes)